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

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

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

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

它真的依赖于编译器吗?

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

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

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

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

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

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

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