2011-10-07 58 views
19

例如,当我在C中编写7>1(如果C99不是一直以来的特性,那么说C99),我可以期待结果恰好是1还是只是一个非零值?这对所有bool操作员都适用吗?是>,<,!,&&,||的“真”结果或==定义?

+3

这是最有可能是重复的,但我不能够找到它:-( – mbq

+3

@TRD:不正确.C表达式'7> 1'产生类型为'int'的结果,值为' –

回答

35

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

每个运营商<(小于),>(大于)的,< =(小于或等于),和> = (大于或等于)应得到如果指定的关系为真和如果是假的) 结果具有类型INT

至于相等运算,它有点进一步在§6.5.9(==!=):

的==(等于),=(不等于)运算符是类似到关系 运算符,但其优先级较低)每个运算符产生如果 指定的关系为真,并且如果它为假。结果有int。对于任何一对 操作数,其中一个关系是正确的。

逻辑AND和OR的逻辑还没有有点进一步§6.5.13(&&

的& &操作者应得到如果两个操作数的比较不等于0;否则,它 产量。结果有int

...和§6.5.14(||

的||如果其任一操作数比较不等于0,则操作员应产生;否则,它 产量。结果有int

而一元算术运算符!的语义超过在§6.5.3.3/ 4:

逻辑否定运算符的结果!是如果其操作数的值与 不等于0,如果它的操作数的值等于0,则结果的类型为int。表达式!E相当于(0 == E)。

结果类型是int全线,与01作为可能的值。 (除非我错过了一些。)

+6

并且很方便stdbool.h将true和false定义为1和0 (C99 7.16) – Lundin

+0

好,特别是因为&&和||在其他语言中表现不同(返回最后一个评估值)如果不包含标准操作符,可以使用'!!'或[cast to '''bool'](http://www.jacquesf.com/2011/04/in-defense-of-the-c99-boolean-type/)。 – Tobu

14

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

+0

提及Postel定律+1 – glglgl

6

从ISO C99标准,部分6.5.8:

6每个运营商<(小于)的,>(大于),< =(小于 或等于),和> =(大于或等于)应该在 指定的关系为真时产生1,如果为假,则为0。结果有 int类型。

从节6.5.9:

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

运算符与逻辑连接(&&)和析取(||)运算符发生同样的事情。附注:这就是为什么按位运算符(&|)通常可用作逻辑运算符的非短路版本。

4

所有的C 运营,其产生逻辑真/假值总是产生int类型的结果,其值为0为假,1为真。

对于所有产生逻辑真/假值的C 表达式,情况并非如此。例如,如果条件为假,则在<ctype.h>isdigit(),isupper()等)中声明的is*()字符分类函数将返回0,但如果条件为真,则可能会返回任何非零值。

只要你直接使用结果作为条件:

if (isdigit(c)) ... 
if (!isdigit(c)) ... 
if (isdigit(c) || islower(c)) ... 

试图把它比作什么:

if (isdigit(c) == 1) ... /* WRONG */ 
if (isdigit(c) == true) ... /* ALSO WRONG */ 

这应该不会造成任何问题。

(您可以安全的结果比较0false,但没有很好的理由这样做,这就是!操作是什么。)

相关问题