什么是&&&&在C中操作

int main() { int i, c; i: for (i = 0; i < 3; i++) { c = i &&&& i; printf("%d\n", c); } return 0; } 

上面的程序使用gcc编译的输出是

 0 1 1 

在上面的程序中如何评估c?

标签作为值的使用是一个gcc扩展(见这里 )。 您的表情细分:

 c = i &&&& i; 

等同于:c = i &&(&& i); 其中&&i是标签i的地址。

请记住,你在这里结合了两个完全不同的“对象”。 第一个是循环通过0, 1, 2i变量,而第二个是标签i ,其地址总是一些非零值。

这意味着只有当变量 i0时,放置在C中的结果才会是0 (假)。 这就是为什么你得到0,1,1序列。

另一方面,如果我的一个奴才给我这样的代码用于生产,我会认真思考“员工管理实践”。 任何消除这种怪异可能性的东西在我看来都是好事:-)

在这种情况下,它也被解析为&&&& 。 第一个是logical AND但第二个&&是标签的地址,而不是变量i的地址。 (这是gcc扩展)

这将被解析为c = (i) && (&&i) ; //括号只是为了让人们可读。

&给你变量i的地址。 你刚才在这个问题前几分钟提出的问题。

有关标签和值的地址的更多信息, 请参阅此gcc扩展。

编辑 :因为&&逻辑与总是遵循语句的短路。因此,在第一种情况下,它将为0因为它发现i=0所以它不会去&&i (逻辑表达式的第二部分)。

但是,在所有后来的情况下, i不是0所以它会给出TRUE并会去下一个表达&&i是标签i地址(我的地址将永远评估为TRUE

所以完整表达式的结果总是为TRUE意味着1除了第一种情况,其中i0 。 因此你正在看到结果

 0 1 1