在C中零(!0)的逻辑非编译器依赖吗?

d7v8vwbk  于 2023-04-11  发布在  其他
关注(0)|答案(3)|浏览(151)

我看到一篇文章提到!0的结果依赖于编译器。结果可以是1或FF或FFFF等等。
对于C99标准6.5.3.3一元算术运算符,
如果操作数的值比较不等于0,则逻辑求反运算符!的结果为0;如果操作数的值比较等于0,则结果为1。结果的类型为int。表达式!E等效于(0==E)。
它真的依赖于编译器吗?

yzckvree

yzckvree1#

你似乎已经回答了你自己的问题,引用了标准中规定结果必须为0或1的内容。
因此,我能猜到的是,你在问是否所有的C编译器都符合这方面的标准。因为我没有使用过所有的C编译器,所以我真的不能肯定地回答这个问题。我从来没有使用过或听说过一个产生任何其他价值的编译器-考虑到我花了几年时间在这里,在Usenet上,等等。如果真有这样的野兽存在,我可能听说过它。
编辑:可能值得注意的是,即使在K&R1中,它也被特别描述为产生0或1(§A.7.2):
如果操作数的值为0,则逻辑否定运算符的结果为1;如果操作数的值为非零,则结果为0。

col17t5w

col17t5w2#

每个编译器都应该在它们的描述中列出它们遵循的标准。当然,这种描述并不总是完全正确的(一些编译器包含错误或对标准的误解),但是布尔值的行为是如此简单和古老(来自C的第一天),如果一个新的编译器表现不同,我会感到非常惊讶。
所以我总是把它作为一个官方标准和事实上的标准:(!0) = 1(!1) = 0,都是int类型。
但是要注意,在C中,布尔运算符返回一个bool值,所以如果你在C中编译,将使用bool,而不是int。然而,bool和int是可以直接互换的,除了一些C++编译器会在你做一些奇怪的事情时警告你,比如bool x = 10;

qco9c6ql

qco9c6ql3#

在我的程序中,我使用了移位和布尔值的乘法。它可以吗?它的工作原理是!0 == 1;以下是一些例子:

//i'm using !! because i'm not sure whether pins return boolean values(0 or 1) or int values(0 or random not zero)
//...
message |= !!slave_data; // OR with 0/1
//...
P1 = !!P0_0 * master_counter | !P0_0 * 0xFF; //branchles assigment
//...

相关问题