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

时间:2011-10-07 12:41:54

标签: c logical-operators

例如,当我在C中写7>1时(如果这不是一个永远存在的特征,请说C99),我可以期望结果恰好是1还是只有一些非零值?这适用于所有bool运营商吗?

4 个答案:

答案 0 :(得分:35)

在C99§6.5.8关系运算符中,第6项(<><=>=):

  

每个运营商&lt; (小于),&gt; (大于),&lt; =(小于或等于),&gt; =   如果指定的关系为真,则(大于或等于)将产生 1 ,如果为假,则 0   结果的类型为 int

至于等式运算符,它在§6.5.9(==!=)中更进一步:

  

==(等于)和!=(不等于)运算符类似于关系运算符   除了优先级较低的运算符之外的每个运算符如果是,则运算符 1   指定的关系为true,如果为false,则为 0 。结果的类型为 int 。对于任何一对   操作数,其中一个关系是真的。

逻辑AND和逻辑OR在§6.5.13(&&

中更进一步
  

&amp;&amp;如果两个操作数的比较不等于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为可能值。 (除非我错过了一些。)

答案 1 :(得分:14)

C跟随Postel's Law的布尔运算符:在你做的事情上保守一点,在你接受别人的事情上保持自由。它会在布尔表达式中将任何非零值视为true,但它总是会产生0或1本身。 2 != 3始终为1

答案 2 :(得分:6)

根据ISO C99标准,第6.5.8节:

  

6每个运营商&lt; (小于),&gt; (大于),&lt; =(小于   或者等于),并且&gt; =(大于或等于)如果是,则产生1   指定的关系为true,如果为false则为0。结果是   输入int。

从第6.5.9节开始:

  

3 ==(等于)和!=(不等于)运算符类似于   关系运算符除了它们的优先级较低之外。每   如果指定的关系为真,则运算符的结果为1,如果为,则为0   这是假的。结果是int类型。对于任何一对操作数,   其中一个关系是真的。

逻辑连接(&&)和析取(||)运算符也会发生同样的事情。

PS:顺便说一句,这就是为什么按位运算符(&|)通常可以用作逻辑运算符的非短路版本。

答案 3 :(得分:4)

所有产生逻辑上真/假值的C 运算符总是会产生int类型的结果,其值为0为false,1为true。

对于所有产生逻辑真/假值的C 表达式,情况并非如此。例如,is*()<ctype.h>isdigit()等中声明的isupper()字符分类函数返回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进行比较,但没有充分理由这样做;这就是!运算符的用途。)