C 是",;“真的”;结果><&&;,| |or==已定义?
例如,当我用C写C 是",;“真的”;结果><&&;,| |or==已定义?,c,logical-operators,C,Logical Operators,例如,当我用C写7>1时(如果这不是一个一直存在的特性,那么就说C99),我能期望结果正好是1还是仅仅是一些非零值?这是否适用于所有布尔运算符?在C99§6.5.8关系运算符第6项(,=)中: 每个操作员(大于)= 如果指定的关系为真,则(大于或等于)应产生1,如果为假,则产生0) 结果的类型为int 至于相等运算符,它在§6.5.9(=和!=)中更进一步: ==(等于)和!=(不等于)运算符类似于关系运算符 运算符(优先级较低的除外)如果 指定的关系为true,如果为false,则为0。结果的
7>1
时(如果这不是一个一直存在的特性,那么就说C99),我能期望结果正好是1还是仅仅是一些非零值?这是否适用于所有布尔运算符?在C99§6.5.8关系运算符第6项(
,=
)中:
每个操作员<(小于),>(大于)=
如果指定的关系为真,则(大于或等于)应产生1,如果为假,则产生0)
结果的类型为int
至于相等运算符,它在§6.5.9(=
和!=
)中更进一步:
==(等于)和!=(不等于)运算符类似于关系运算符
运算符(优先级较低的除外)如果
指定的关系为true,如果为false,则为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)
结果类型为int
,可能的值为0
和1
。(除非我遗漏了一些。)C的布尔运算符如下:做事要保守,接受别人的东西要自由。在布尔表达式中,它会将任何非零值视为true,但它本身始终会生成0或1<代码>2!=3
始终是ISO C99标准第6.5.8节中的1
6如果
指定的关系为true,如果为false,则为0。结果是
输入int
根据第6.5.9节:
3==(等于)和!=(不等于)运算符类似于
除优先级较低之外的关系运算符。每个
如果指定的关系为真,则运算符的值为1,如果为真,则为0
这是错误的。结果的类型为int。对于任何一对操作数,
其中有一种关系是正确的
逻辑连接(&&
)和析取(|
)运算符也会发生同样的情况
PS:顺便说一句,这就是为什么按位运算符(&
和|
)通常可以用作逻辑运算符的非短路版本。所有产生逻辑真/假值的C运算符总是产生类型为int
的结果,值0
表示假,值1
表示真
并非所有C表达式都会产生逻辑上的真/假值。例如,is*()
字符分类函数在
中声明(isdigit()
,isupper()
等),如果条件为false,则返回0
,如果条件为true,则可能返回任何非零值
只要将结果直接用作条件:
if (isdigit(c)) ...
if (!isdigit(c)) ...
if (isdigit(c) || islower(c)) ...
不要试图将其与以下内容进行比较:
if (isdigit(c) == 1) ... /* WRONG */
if (isdigit(c) == true) ... /* ALSO WRONG */
这应该不会引起任何问题
(您可以安全地将结果与
0
或false
进行比较,但没有很好的理由这样做;!
运算符就是这样做的。)它很可能是重复的,但我找不到它:-(@TRD:不正确。C表达式7>1
生成类型为int
的结果,值为1
。并且stdbool.h方便地将true和false定义为1和0(C99 7.16)。很好,特别是因为&&和| |在其他语言中的行为不同(返回上次计算的值).如果不涉及标准操作员,可使用!!
或进行夹紧。