C 是",;“真的”;结果><&&;,| |or==已定义?

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。结果的

例如,当我用C写
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)。很好,特别是因为&&和| |在其他语言中的行为不同(返回上次计算的值).如果不涉及标准操作员,可使用
!!
或进行夹紧。