零(!0)编译器的逻辑否定依赖于C吗?

时间:2011-10-30 15:50:15

标签: c c99 negation

我遇到一篇文章,其中提到!0的结果与编译器有关。结果可以是1或FF或FFFF等等。

关于C99标准6.5.3.3一元算术运算符,

  

逻辑否定运算符的结果!如果其操作数的值比较,则为0   不等于0,1如果其操作数的值比较等于0.结果的类型为int。   表达式!E等价于(0 == E)。

它真的是编译器依赖吗?

2 个答案:

答案 0 :(得分:10)

似乎已经回答了你自己的问题,引用了它指定结果必须为0或1的标准。

因此,我可以猜到的是,您在询问所有C编译器是否符合此方面的标准。由于我没有使用过所有编写过的C编译器,所以我无法真正回答这个问题。我从来没有使用过或听说过一个产生任何其他价值的东西 - 而且考虑到我在这里闲逛,在Usenet等等,似乎可能如果这样的野兽我可能听说过它。

编辑:值得注意的是,即使在K& R1中,它也被特别描述为产生0或1(§A.7.2):

  

逻辑否定运算符的结果!如果其操作数的值为0,则为1;如果其操作数的值为非零,则为0。

答案 1 :(得分:1)

每个编译器在其描述中都应该有他们遵循的标准列表。 当然,这种描述并不总是完全正确(某些编译器包含对标准的错误或误解),但是使用boolean的行为是如此简单和如此陈旧(来自C的第一天),如果一个新的编译器我真的会感到惊讶表现不同。

所以我总是把它作为官方标准,也是事实上的标准:(!0) = 1(!1) = 0,都是int类型。

但要注意,在C ++中,布尔运算符返回bool值,因此如果在C ++中编译,将使用bool,而不是int。但是bool和int是可以直接互换的,除了一些C ++编译器会警告你,如果你做了一些奇怪的事情,比如bool x = 10;