#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
正在上面的程序进行评估?
这是c = i && (&i);
,与第二部分是多余的,因为&i
将永远不会计算为false
。
对于用户定义类型,在这里你可以真正一元超负荷operator &
,它可能是不同的,但它仍然是一个非常糟糕的主意 。
如果打开了警告 ,你会得到这样的:
警告:“我”将始终评估为“真”的地址
没有&&&
运营商或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++