在以下示例中优先级和结合性如何工作?
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的值无关。
因为右边的表达式没有计算,所以 j
和 k
的值保持不变。
此功能称为“Short Circuit Evaluation”。
优先级和结合性仅影响运算符与操作数的分组方式 - 它们不影响表达式求值的顺序。 ||
和 &&
都强制从左到右求值。另外,请记住 &&
和 ||
运算符 短路 如下:
- 在表达式
a || b
中,只有当 a
的计算结果为零时 b
才会计算
- 在表达式
a && b
中,只有当 a
的计算结果为非零时 b
才会被计算
表达式
++i || ++j && ++k
被解析为
(++i) || ((++j) && (++k))
并评估如下:
++i
已全面评估并应用了所有副作用;
++i
的结果为4
,非零;
- 如果左操作数不为零,则
||
不计算右操作数,因此根本不计算++j && ++k
;
说完一切后,只有 i
更新了,j
和 k
没有更新。
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的值无关。
因为右边的表达式没有计算,所以 j
和 k
的值保持不变。
此功能称为“Short Circuit Evaluation”。
优先级和结合性仅影响运算符与操作数的分组方式 - 它们不影响表达式求值的顺序。 ||
和 &&
都强制从左到右求值。另外,请记住 &&
和 ||
运算符 短路 如下:
- 在表达式
a || b
中,只有当a
的计算结果为零时b
才会计算 - 在表达式
a && b
中,只有当a
的计算结果为非零时b
才会被计算
表达式
++i || ++j && ++k
被解析为
(++i) || ((++j) && (++k))
并评估如下:
++i
已全面评估并应用了所有副作用;++i
的结果为4
,非零;- 如果左操作数不为零,则
||
不计算右操作数,因此根本不计算++j && ++k
;
说完一切后,只有 i
更新了,j
和 k
没有更新。