C++ 什么是&&&;C语言操作

C++ 什么是&&&;C语言操作,c++,c,operators,compiler-optimization,gcc-warning,C++,C,Operators,Compiler Optimization,Gcc Warning,使用-Wall或-Waddress选项,gcc发出警告: 0 1 1 在上述计划中,c是如何评估的?它是c=i&&i,第二部分是多余的,因为&i永远不会计算为false 对于用户定义的类型,实际上可以重载一元运算符&,这可能有所不同,但这仍然是一个非常糟糕的想法 如果打开警告,您将得到如下结果: 警告:“i”的地址将始终计算为“true” C中没有&&&运算符或标记。但是&&(逻辑“and”)和&(一元地址或按位“and”)运算符确实存在 根据规则,这: warning: the addres

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

0
1
1
在上述计划中,
c
是如何评估的?

它是
c=i&&i,第二部分是多余的,因为
&i
永远不会计算为
false

对于用户定义的类型,实际上可以重载一元
运算符&
,这可能有所不同,但这仍然是一个非常糟糕的想法

如果打开警告,您将得到如下结果:

警告:“i”的地址将始终计算为“true”


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

根据规则,这:

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

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

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

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

这意味着这里使用
&&&
只是为了故意混淆。任务也可以是以下任何一项:

c = i && & i;
c=i&&1;
c=!!我
c=(bool)i;//C++或C语言
c=i?1 : 0;        /* C*/
c=i?真:假;//C++

我相信是
I&&I)
?有趣的是,我在网上找不到重复的帖子。
while(我&&&&I可能是重复的,但不是重复的,但这是一个类似的问题,这是一个好问题link@Manav为什么不:
c=i&(&&i);
;其中
i
是某个标签?@anishsane
i
被定义为
int
,问题中没有标签。此外,maximum munch…@anishsane:获取标签地址的
&
运算符无论如何都是非标准的gcc扩展。但即使它是标准的,maximum munch规则也会阻止它以这种方式解析om(除非插入空格)。实际上,
&i
可以计算为
false
。它有时用于默认值。例如:
void fn(type&x=*reinterpret\u cast(NULL))如果调用
fn
而没有参数,那么
&x
fn
中的值是多少?它是0 a.k.a.false。但是,按照所描述的方式使用它,除非
i==0
,否则它始终是真的,如果像我所描述的那样使用它,那么它将是
c=&i&&i
@Adrian您不能取消引用空指针,which是
*
重新解释强制转换(NULL)
之前所做的。
c = i && & 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++