C by K&R - 关系或逻辑表达式的数值

标签 c expression semantics

在 K&R 的《C 编程语言》第 2 期第 42 页第 2.6 节“关系和逻辑运算符”中,作者表示:

By definition, the numeric value of a relational or logical expression is 1 if the relation is true, and 0 if the relation is false.

我对这个措辞感到困惑。例如,在逻辑表达式中

x && y

不存在正确或错误的关系。措辞不应该是:

By definition, the numeric value of a relational or logical expression is 1 if the expression is true, and 0 if the expression is false.

最佳答案

x && y

由于 x 和 y 与 && 结合使用,编译器需要逻辑( bool )值

在c中,0为假,而非0为真。因此,您从标准中发布的声明是,逻辑表达式的计算结果为 0 或非零(实际上是 1,但在测试中任何非零值都被视为 true)。

因此这段代码被解释为

(x != 0) && (y != 0)

这取决于 x 和 y 的当前值,例如

1 && 0

这是

true && false

遵循 0 == false 且 !0 == true 的规则。因此,该表达式为 false,因此您发布的语句的计算结果为 0。

请注意,这种困惑很大程度上来自于 c 最初没有 bool 类型这一事实。因此约定 0 = false 并且 !0 = true。这具有允许直接测试数字(特别是指针)的有益副作用,如

while(ptr--)
{
}

相当于

while(ptr-- != 0)
{
}

关于C by K&R - 关系或逻辑表达式的数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48588702/

相关文章:

c - 交换函数返回一个不在我的数组中的数字

c - scanf() 语句上的段错误(核心转储)

javascript - AngularJS 通过内联表达式过滤

expression - Power Query—— native 查询中的列表值

java子类或字段,良好的语义

c - 什么是 (void (**) ()) 以及如何对它进行类型定义?

c - 如何提高 Gear S2 加速度传感器采样率

r - R中的 "{"类是什么?

computer-science - 这个语句可以被视为类不变量吗?

javascript - onApprove 和 onDeny 未在模态 - 语义 ui 中触发