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?
答案 0 :(得分:28)
在这种情况下,它也被解析为&&
和&&
。
第一个是logical AND
,但第二个&&
是标签i
的地址,而不是变量i
的地址。 (这是gcc扩展名)
这将被解析为c = (i) && (&&i)
; //括号只是为了使它具有人类可读性。
&
为您提供变量i
的地址。 Which you have just asked few minutes ago in this question .
有关标签和值see this gcc extension.
的详细信息,请参阅 编辑:由于&&
逻辑AND始终跟随语句的短路。在第一种情况下,它会0
,因为它找到了i=0
所以它不会转到&&i
(逻辑表达式的第二部分)。
但是在以后的所有情况下,i
都不是0
所以它会给TRUE
并转到下一个表达式&&i
,它是标签{{1}的地址(i
的地址将始终评估为i
。)
所以完整表达式的结果始终为TRUE
表示TRUE
,但1
为i
的第一种情况除外。因此,您正在看到结果
0
答案 1 :(得分:25)
将标签用作值是gcc
扩展名(请参阅here)。你的表达段:
c = i &&&& i;
相当于:
c = i&amp;&amp; (安培;&安培;ⅰ);
其中&&i
是标签i
的地址。
请记住,您在这里组合了两个完全不同的i
“对象”。第一个是循环i
的{{1}}变量,第二个是标签0, 1, 2
,其地址始终为非零值。
这意味着仅当变量 i
为0
时,放在C中的结果才为i
(false)。这就是你获得0
序列的原因。
顺便说一句,如果我的一个小伙子给我买了这样的代码供生产使用,我会认真考虑“员工管理实践”。在我看来,任何能消除这种怪物可能性的东西都是好事: - )