C中有什么双重否定

关于编译器“思考”这个问题我有一个争议:

a = 8; b = !!a; 

那么,是b == 0x01TRUE总是0x01或者可能是0xFF0xFFFF0xFFFFFFFF等。?

如果我想提取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或者可能是0xFF0xFFFF0xFFFFFFFF等。?

true是一个整数常量为1的宏不是由C标准定义的。 各种实现使用值1定义它。它可能具有其他值。 它肯定应该是非零的。

什么是更好的使用?

 A) a>0?1:0 B) !!a 

两者都会产生值为01int 。 一个合理到好的编译器应该为两者生成相同的代码(如果没有签名)。 使用1)符合您的组编码标准的forms,否则2)最好传达代码的含义。 导致类型(bool)第三个选项:

 C) (bool) a 

如果a是有符号的,那么a>0?1:0不等于!!aa != 0 ? 1 :0 a != 0 ? 1 :0相当于!!a


*如果b是1位有符号位字段,则b = !!8将具有值-1。