什么是用C &&&操作(What is &&& operation in C

2019-07-05 20:17发布

#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正在上面的程序进行评估?

Answer 1:

这是c = i && (&i); ,与第二部分是多余的,因为&i将永远不会计算为false

对于用户定义类型,在这里你可以真正一元超负荷operator & ,它可能是不同的,但它仍然是一个非常糟糕的主意

如果打开了警告 ,你会得到这样的:

警告:“我”将始终评估为“真”的地址



Answer 2:

没有&&&运营商或C.令牌但&& (逻辑“与”)和& (一元地址或按位“和”)运营商确实存在。

由最大适合规则,这样的:

c = i &&& i;

相当于这个:

c = i && & i;

它设置c为1,如果两个i&i是真实的,为0;如果它们中的是假的。

对于int,任何非零值是true。 对于一个指针,任何非空值是真(和对象的地址总是非空)。 所以:

它设置c为1,如果i是非零,或者0 ,如果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++


文章来源: What is &&& operation in C