It was pointed by all answers that the initial problem was a viewer problem.
In my first answer I explained how to overcome the problem using reverseclip.
I'll try now to explain why this problem occurs in viewers.
This is a guess, but I think with hight probability ;)
First thing first: anti-aliasing
If we draw a white circle over a black circle with the same diameter, due to anti-aliasing, all viewers that I have checked (Sumatra, Acrobat 8, Chrome, EBookDroid, Acrobat for Android, MuPDF, ezPDF, Google Document for Android) display a thin gray residue of the black circle. This happens probably because, they first draw the black circle with anti-aliasing, then the white one with anti-aliasing.
\begin{tikzpicture}
\fill[black] circle(1);
\fill[white] circle(1);
\begin{tikzpicture}

But the bitmap transformers (Photoshop CS5, ghostscript, Acrobat 8 export to PNG), display no visible halo, probably because they render first the two circles and anti-alise after.
Clipping
When viewers clip some paths they have two choices:
- clip all path one by one and render them after, or
- group all paths and clip the result after.
So in the following code
\begin{tikzpicture}
\clip circle(1);
\fill[black] circle(1);
\fill[white] circle(2);
\begin{tikzpicture}
some viewers (like Chrome and Acrobat 8, ezPDFReader, Google Document for Android) will clip the two circles separately and render them after, which result in the same thing as the first code. And other viewers (like Sumatra, Acrobat for Android, EBookDroid, MuPDF) will group first the paths and clip them after, wich result in a empty page (white circle on white background), like for the bitmap transformers (ghostscript, Photoshop CS5 and Acrobat 8 export to PNG).
To proof this, we can force the viewers to group the path before clipping by using transparency group and then there is no visible halo in any cases. Here is the test code:
\documentclass[varwidth,border=7mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% A: same in all viewers (visible halo)
\begin{scope}[shift={(0,0)}]
\fill[black] circle(1);
\fill[yellow!20] circle(1);
\node{A};
\end{scope}
% B: same in all viewers (visible halo)
\begin{scope}[shift={(3,0)}]
\fill[black] circle(1);
\clip circle(1);
\fill[yellow!20] circle(2); % clipped is the same as circle(1)
\node{B};
\end{scope}
% C: depends on viewer (clip separately paths or clip grouped paths ?)
\begin{scope}[shift={(0,-3)}]
\clip circle(1);
\fill[black] circle(1);
\fill[yellow!20] circle(2);
\node{C};
\end{scope}
% D: same in all viewers (no halo, due to grouping paths before clipping)
\begin{scope}[shift={(3,-3)}]
\clip circle(1);
\begin{scope}[transparency group]
\fill[black] circle(1);
\fill[yellow!20] circle(2);
\end{scope}
\node{D};
\end{scope}
\end{tikzpicture}
\end{document}
The result in ghostscript, Photoshop CS5 and Acrobat export to PNG:

The result in Sumatra,Acrobat for Android, EBookDroid and MuPDF:

The result in Chrome, Acrobat 8, ezPDFReader and Google Docs for Android:
