197
#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

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

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

c在上述计划中如何评估?

4

2 回答 2

275

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

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

如果你打开警告,你会得到类似的东西:

警告:“i”的地址将始终评估为“真”</p>

于 2012-12-19T06:51:26.037 回答
119

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

根据最大咀嚼规则,这:

c = i &&& i;

相当于:

c = i && & i;

如果两者都为真,则设置c为 1 ,如果其中任何一个为假,则设置为 0。i&i

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

如果非零或等于零,则设置c为 1 。i0i

这意味着&&&这里使用的只是故意混淆。分配也可能是以下任何一种:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
于 2012-12-19T06:52:56.810 回答