例如,当我在C中写7>1
时(如果这不是一个永远存在的特征,请说C99),我可以期望结果恰好是1还是只有一些非零值?这适用于所有bool运营商吗?
答案 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)。
结果类型全面int
,0
和1
为可能值。 (除非我错过了一些。)
答案 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 */
这不应该导致任何问题。
(您可以安全地将结果与0
或false
进行比较,但没有充分理由这样做;这就是!
运算符的用途。)