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

mbq*_*mbq 19 c logical-operators

例如,当我7>1用C语言写入时(如果这不是一直是特征,则说是C99),我可以期望结果恰好是1还是只有一些非零值?这适用于所有bool运营商吗?

Mat*_*Mat 35

在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,1,如果其操作数的值进行比较等于0.结果具有类型INT.表达式!E等价于(0 == E).

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

  • 方便的stdbool.h将true和false定义为1和0(C99 7.16). (6认同)

Joh*_*ica 15

C遵循Postel定律作为其布尔运算符:在你所做的事情上要保守,在你接受别人的事情上保持自由.它会在布尔表达式中将任何非零值视为true,但它总是会产生0或1本身.2 != 3永远1.


thk*_*ala 6

根据ISO C99标准,第6.5.8节:

6如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)将产生1,如果指定的关系为0则为0是假的.结果是int类型.

从6.5.9节:

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

逻辑结合(&&)和disjunction(||)运算符也会发生同样的事情.

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