In this case, it is also analyzed as && and && . The first is logical AND , and the second && is the address of label i , not the address of variable i . (this is a gcc extension)
This will be analyzed as c = (i) && (&&i) ; // The brackets are intended only to make it understandable to humans.
& gives you the address of the variable i . Which you just asked a few minutes ago in this question.
For more information on label addresses and values, see this gcc extension.
EDIT : because && logical AND always follows the operator short circuit. In the first case, it will be 0 , since he found i=0 , so he will not go to &&i (the second part of the logical expression).
But in all subsequent cases, i not 0 , so it will give TRUE and move on to the next expression &&i , which is the address of label i (and address i will always evaluate to TRUE .)
Thus, the result of the full expression will always be TRUE means 1 , except for the first case when i is 0 . Therefore, you see the result
0 1 1
source share