我对编译器和#34;思考"有争议。关于这个:
a = 8;
b = !!a;
那么,是b == 0x01
吗? TRUE
总是0x01
还是0xFF
,0xFFFF
,0xFFFFFFFF
等等。
如果我想0x00
只提取(a == 0)
,0x01
如果(a > 0)
这个双重否定方法有效吗?
换句话说:要获得只有0或1的结果,最好使用什么?
a)a>0?1:0;
b)!!a
我希望你理解我的问题。
答案 0 :(得分:4)
是的,b == 1
。任何布尔运算符的结果总是0或1.虽然可以做得更好......
如果(a == 0),我想只提取0x00,如果(a> 0),我想提取0x01
b = a > 0;
最准确地反映了您的规则。
答案 1 :(得分:4)
您尚未提供足够的信息来判断!!a
是否适用于您的目的。
你说你确实需要a > 0
的结果。但是,如果!!a
已签名且保留负值,则不等同于a
。如果这是可能的,那么答案显然是"没有"。
!!a
相当于a != 0
,而不是a > 0
。
答案 2 :(得分:1)
!!a
将为0或1,类型为int
。零a
为0,否则为1。
至于你的选择(a)和(b),由于a
可能是否定的,它们不等效。除此之外,您可以认为a > 0 ? 1 : 0
更清晰,但在性能关键型应用程序中!!a
可能更好,因为它不会分支,而三元条件可能会转储管道。但是一个好的编译器会优化出来。我很少使用,因为if (a)
和if (!!a)
之类的功能相同。
答案 3 :(得分:1)
下面的逻辑否定运算符
!
的结果是0,如果其操作数的值比较不等于0,1如果其操作数的值比较等于0.结果具有类型int
。表达式!E
相当于(0==E)
。 C11§6.5.3.35
b
典型值为1(或者可能为-1,见下文)。
a = 8;
b = !!a;
那么,是
b == 0x01
吗?
是(*见下文)
TRUE
始终是0x01
还是0xFF
,0xFFFF
,0xFFFFFFFF
等。?
在<stdbool.h>
中,true
是一个整数常量为1的宏。TRUE
未由C标准定义。各种实现使用值1定义它。可能具有其他值。它肯定应该是非零的。
什么是更好用?
A) a>0?1:0
B) !!a
两者都会产生int
,其值为0
或1
。一个合理到好的编译器应该为两者生成相同的代码(如果未签名的a
)。使用1)符合您的组编码标准的表格,否则2)最好传达代码的含义。第三个选项导致类型(bool)
:
C) (bool) a
如果a
已签名,则a>0?1:0
不等同于!!a
。 a != 0 ? 1 :0
相当于!!a
。
*
如果b
是1位有符号位字段,则b = !!8
的值为-1。
答案 4 :(得分:0)
在速度方面,我认为这高度依赖于你正在使用的编译器和处理器。
较长的表达式会产生4到16个字节的可执行文件。