什么是&&&在C中操作

时间:2012-12-19 06:48:11

标签: c++ c operators compiler-optimization gcc-warning

#include <stdio.h>

volatile int i;

int main()
{
    int c;

    for (i = 0; i < 3; i++) 
    {
         c = i &&& i;
         printf("%d\n", c);
    }

    return 0;
}

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

0
1
1

使用-Wall-Waddress选项,gcc会发出警告:

warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]

如何在上述计划中评估c

2 个答案:

答案 0 :(得分:270)

它是c = i && (&i);,第二部分是多余的,因为&i永远不会评估为false

对于用户定义的类型,您实际上可以重载一元operator &,它可能会有所不同,但它仍然是非常糟糕的主意

如果你打开警告,你会得到类似的内容:

  

警告:“i”的地址将始终评估为“true”

答案 1 :(得分:118)

C中没有&&&运算符或标记。但是&&(逻辑“和”)和&(一元地址或按位“和”)运算符确实存在

根据maximal munch规则:

c = i &&& i;

相当于:

c = i && & i;

如果ci都为真,则将&i设置为1,如果其中任何一个为假,则将c设置为0.

对于int,任何非零值都为true。对于指针,任何非null值都为true(并且对象的地址始终为非null)。所以:

如果i非零,则会将0设置为1;如果i等于零,则设置为&&&

这意味着c = i && 1; c = !!i; c = (bool)i; // C++ or C with <stdbool.h> c = i ? 1 : 0; /* C */ c = i ? true : false; // C++ 仅用于故意混淆。作业也可以是以下任何一种:

{{1}}