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, 2
的i
变量,而第二个是标签i
,其地址总是一些非零值。
这意味着只有当变量 i
是0
时,放置在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
除了第一种情况,其中i
是0
。 因此你正在看到结果
0 1 1