请解释&&和||的优先级之间的明显冲突 和表达式的实际结果

6 c

我不明白以下程序的输出:

#include<stdio.h>

int main()
{
    int i=-3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    printf("%d %d %d %d\n", i, j, k, m);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出-2 2 0 1代替-2 3 1 1,意味着在表达式之前++i评估(并导致||运算符使其右侧短路),++j && ++k这似乎与&&运算符具有更高优先级的事实相矛盾||.

有人解释原因吗?

Jer*_*fin 22

输出应该是这样的:

Error, line 2: 'm': undefined variable.
Run Code Online (Sandbox Code Playgroud)

编辑:修复后,只++i应评估.优先权不会决定(甚至影响)评估顺序.优先级意味着表达式等同于++i || (++j && ++k).评估的顺序||或者&&总是评估左操作数,然后是一个序列点.在序列点之后,当且仅在必要时评估右操作数以确定最终结果(即,||如果左操作数被评估为零,&&则评估右操作数; 如果左操作数被评估为非,则评估右操作数-零).

在这个表达式中,++i进行求值,然后因为它是左操作数||并且求值为非零,所以不评估表达式的其余部分.


jwe*_*ich 2

表达方式:

++i || ++j && ++k
Run Code Online (Sandbox Code Playgroud)

相当于:

(++i) || ((++j) && (++k))
Run Code Online (Sandbox Code Playgroud)

解释:

  1. ++i被评估—— (-2) || ((++j) && (++k))
  2. 运算||符被评估 - (1);

由于1 || anything计算结果为 true,因此不会计算正确的操作数。因此,&&优先级在这里并不重要。这种短路在 C 和 C++ 中均由相关标准保证(请参阅是否强制要求短路逻辑运算符?以及求值顺序?)。

现在,尝试使用子表达式,如下所示:

(++i || ++j) && ++k
Run Code Online (Sandbox Code Playgroud)

这相当于:

((++i) || (++j)) && (++k)
Run Code Online (Sandbox Code Playgroud)

解释:

  1. ++i被评估—— ((-2) || (++j)) && (++k)
  2. ||被评估——(1) && (++k)
  3. ++k被评估—— (1) && (1)
  4. 评估真实;