C中有什么双重否定

时间:2016-03-07 15:14:08

标签: c

我对编译器和#34;思考"有争议。关于这个:

a = 8;
b = !!a;

那么,是b == 0x01吗? TRUE总是0x01还是0xFF0xFFFF0xFFFFFFFF等等。

如果我想0x00只提取(a == 0)0x01如果(a > 0)这个双重否定方法有效吗?

换句话说:要获得只有0或1的结果,最好使用什么?

a)a>0?1:0; b)!!a

我希望你理解我的问题。

5 个答案:

答案 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还是0xFF0xFFFF0xFFFFFFFF等。?

<stdbool.h>中,true是一个整数常量为1的宏。TRUE未由C标准定义。各种实现使用值1定义它。可能具有其他值。它肯定应该是非零的。

  

什么是更好用?

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

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

C)  (bool) a

如果a已签名,则a>0?1:0不等同于!!aa != 0 ? 1 :0相当于!!a

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

答案 4 :(得分:0)

在速度方面,我认为这高度依赖于你正在使用的编译器和处理器。

较长的表达式会产生4到16个字节的可执行文件。