是>,<,!,&&,||的“真实”结果 或==定义?
例如,当我在C中写入7>1
时(如果这不是一直是特征,则说是C99),我可以期望结果恰好是1还是只有一些非零值? 这适用于所有bool运营商吗?
在C99§6.5.8关系运算符中,第6项( <
, >
, <=
和>=
):
如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)将产生1,如果是,则为0 false)结果的类型为int 。
至于相等运算符,它在§6.5.9( ==
和!=
)中更进一步:
==(等于)和!=(不等于)运算符类似于关系运算符,除了它们的优先级较低。如果指定的关系为真,则每个运算符产生1,如果为假,则每个运算符产生0 。 结果是int类型。 对于任何一对操作数,其中一个关系是正确的。
§6.5.13( &&
)中的逻辑AND和逻辑OR有点进一步
如果两个操作数的比较不等于0,&&运算符将产生1 ; 否则,它产生0 。 结果是int类型。
......和§6.5.14( ||
)
|| 如果操作数的任何一个比较不等于0,则运算符应该为1 ; 否则,它产生0 。 结果是int类型。
和一元算术运算符的语义!
在§6.5.3.3/ 4结束:
逻辑否定运算符的结果! 如果其操作数的值比较不等于0则为0;如果其操作数的值比较等于0则为1.结果的类型为int 。 表达式!E等价于(0 == E)。
结果类型是全面的int
, 0
和1
作为可能的值。 (除非我错过了一些。)
C遵循Postel定律作为其布尔运算符:在你所做的事情上要保守,在你接受别人的事情上保持自由。 它会在布尔表达式中将任何非零值视为true,但它总是会产生0或1本身。 2 != 3
总是1
。
根据ISO C99标准,第6.5.8节:
6如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)将产生1,如果指定的关系为0则为0是假的。 结果是int类型。
从6.5.9节:
3 ==(等于)和!=(不等于)运算符类似于关系运算符,除了它们的优先级较低。 如果指定的关系为真,则每个运算符产生1,如果为假,则产生0。 结果是int类型。 对于任何一对操作数,其中一个关系是正确的。
逻辑连接( &&
)和析取( ||
)运算符也会发生同样的事情。
PS:顺便说一句,这就是为什么按位运算符( &
和|
)通常可以用作逻辑运算符的非短路版本。
产生逻辑真/假值的所有C 运算符总是产生int
类型的结果,其值为0
表示false, 1
表示true。
对于产生逻辑真/假值的所有C 表达式 ,情况并非如此。 例如,在
( isdigit()
, isupper()
等中声明的is*()
字符分类函数。)如果条件为false,则返回0
,但如果条件为false,则可返回任何非零值真正。
只要您将结果直接用作条件:
if (isdigit(c)) ... if (!isdigit(c)) ... if (isdigit(c) || islower(c)) ...
并且不要试图将它与某些东西进行比较:
if (isdigit(c) == 1) ... /* WRONG */ if (isdigit(c) == true) ... /* ALSO WRONG */
这不应该导致任何问题。
(您可以安全地将结果比较为0
或false
,但没有充分的理由这样做;这就是!
运算符的用途。)