c - 同时使用 && || 进行短路评估运算符(operator)

标签 c short-circuiting

我知道什么是 C 中的短路评估。

a && b(如果 a = 0,则不检查操作数 b)

一个|| b(如果 a = 非零则不检查操作数 b)

但是我卡在这个问题上了

int x = 0;
if (5 || 2 && ++x)
    printf("%d", x);

这会输出 0

我的第一个想法是这样的:

根据优先级表,优先级为++&&||(降序)

  1. ++x:evaluated.x变为1。

  2. 2 &&++x 评估。计算两个操作数。

  3. || 被评估。

但是根据这个,应该打印1,而不是0

我的第二个想法是这样的:

5 || anything

任何东西都不会因为短路评估而被评估,所以这里没有优先级发挥作用。

最佳答案

表达式5 || 2 &&++x 等同于 5 || (2 &&++x) 由于运算符的优先级。

运行时计算表达式 5 || 2 &&++x 从左到右。

正如我们在 OR 中所知,如果第一个条件为真,则不会检查第二个条件。
所以这里 5 被评估为真,所以 (2 &&++x) 将不会被执行。

这就是为什么 x 在这里会保持为 0。

关于c - 同时使用 && || 进行短路评估运算符(operator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879912/

相关文章:

c - 使用指针将结构体添加到数组

c - 在C中注册Lua类

c - 如果项目 A 位于同一个工作区中,项目 A 如何使用项目 B 的库(即指令)?

c++ - 是否存在程序员可能希望避免 bool 表达式的短路求值的合理场景?

tsql - 如何在非数字字段上查询 'between' 数字数据?

c - timeval和微秒之间的精确转换

c - C中的sprintf,循环永远不会结束

c# - 快速退出方法或构造函数有什么好处吗?

php - PHP有短路评估吗?

Java递归问题