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

时间:2012-12-19 07:05:43

标签: c++ c linux operators gcc-warning

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?

2 个答案:

答案 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,但1i的第一种情况除外。因此,您正在看到结果

0

答案 1 :(得分:25)

将标签用作值是gcc扩展名(请参阅here)。你的表达段:

c = i &&&& i;

相当于:     c = i&amp;&amp; (安培;&安培;ⅰ); 其中&&i是标签i的地址。

请记住,您在这里组合了两个完全不同的i“对象”。第一个是循环i的{​​{1}}变量,第二个是标签0, 1, 2,其地址始终为非零值。

这意味着仅当变量 i0时,放在C中的结果才为i(false)。这就是你获得0序列的原因。

  

顺便说一句,如果我的一个小伙子给我买了这样的代码供生产使用,我会认真考虑“员工管理实践”。在我看来,任何能消除这种怪物可能性的东西都是好事: - )