是>,<,!,&&,||的“真实”结果 或==定义?

例如,当我在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)。

结果类型是全面的int01作为可能的值。 (除非我错过了一些。)

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 */ 

这不应该导致任何问题。

(您可以安全地将结果比较为0false ,但没有充分的理由这样做;这就是!运算符的用途。)