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

man*_*m-n 5 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;
}
Run Code Online (Sandbox Code Playgroud)

上面编译的程序的输出gcc

0
1
1
Run Code Online (Sandbox Code Playgroud)

如何在上述计划中评估?

Omk*_*ant 28

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

这将被解析为 c = (i) && (&&i); //括号只是为了使它具有人类可读性.

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

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

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

但是在所有后续的情况下,i并不是0这样,它会给出TRUE并将转到下一个表达式&&i,即标签的地址i(并且地址i将始终评估为TRUE.)

所以充分表达的结果将总是TRUE装置1除了其中第一种情况i0.因此,你看到了结果

0
1
1
Run Code Online (Sandbox Code Playgroud)

  • 一个答案提出一个问题的时刻真的很有趣. (5认同)

pax*_*blo 25

使用标签作为值是一个gcc扩展(见这里).你的表达段:

c = i &&&& i;
Run Code Online (Sandbox Code Playgroud)

等于:c = i &&(&& i); &&i标签的地址在哪里i.

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

这意味着,放置在C中的结果将是0(假),只有当变量 i0.这就是你获得0, 1, 1序列的原因.

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

  • 提及它是一个扩展名+1.这是一个重要的观点. (2认同)