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

What is &&&& operation in C

本文关键字:操作 语言 什么      更新时间:2023-10-16
int main()
{
int i, c;
i:
for (i = 0; i < 3; i++) {
c = i &&&& i;
printf("%dn", c);
}
return 0;
}

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

0
1
1

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

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

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

&为您提供变量i的地址。你几分钟前刚刚问过这个问题。

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

EDIT:由于&&逻辑AND总是跟在语句的短路之后。因此,在第一种情况下,它将是0,因为它找到了i=0,所以它不会转到&&i(逻辑表达式的第二部分)。

但在所有后续情况下,i不是0,因此它将给出TRUE,并将转到下一个表达式&&i,该表达式是标签i的地址(并且i的地址将始终计算为TRUE。)

因此,除了i0的第一种情况之外,全表达式的结果将始终是TRUE意味着1。因此,你看到了的结果

0
1
1

使用标签作为值是gcc的扩展(请参阅此处)。你的表情片段:

c = i &&&& i;

相当于:c=i&amp;(&&i);其中CCD_ 27是标签CCD_。

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

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

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