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