在以下示例中优先级和结合性如何工作?

how the precedence and associativity works in the following example?

int i=3,j=1,k=0,m;
m=++i || ++j && ++k;
printf("%d%d%d%d",i,j,k,m);

//输出为4 1 0 1enter code here // 谁能解释为什么只有 k=0 和 j=1

m = ++i || ++j && ++k; 被分组为 m = ++i || (++j && ++k); 因为 && 具有更高的优先级。但是,它们是从左到右计算的。

因为 ++i = 4,这是一个非零数,所以不计算右侧表达式。我的意思是 (++j && ++k) 没有被评估,因为左手表达式结果是非零的。

对于A||B,如果A = 1,则结果始终为1,与B的值无关。

因为右边的表达式没有计算,所以 jk 的值保持不变。

此功能称为“Short Circuit Evaluation”。

优先级和结合性仅影响运算符与操作数的分组方式 - 它们不影响表达式求值的顺序。 ||&& 都强制从左到右求值。另外,请记住 &&|| 运算符 短路 如下:

  • 在表达式 a || b 中,只有当 a 的计算结果为零时 b 才会计算
  • 在表达式 a && b 中,只有当 a 的计算结果为非零时 b 才会被计算

表达式

++i || ++j && ++k

解析

(++i) || ((++j) && (++k))

评估如下:

  1. ++i 已全面评估并应用了所有副作用;
  2. ++i结果4,非零;
  3. 如果左操作数不为零,则||不计算右操作数,因此根本不计算++j && ++k

说完一切后,只有 i 更新了,jk 没有更新。