【发布时间】:2020-08-05 15:02:14
【问题描述】:
在以下函数中:
int fun(int *k) {
*k += 4;
return 3 * (*k) - 1;
}
void main() {
int i = 10, j = 10, sum1, sum2;
sum1 = (i / 2) + fun(&i);
sum2 = fun(&j) + (j / 2);
}
总和 1 等于 46,总和 2 等于 48。如果没有优先规则,函数将如何运行?
如果没有一致的优先规则,事情会有多大的不同?
【问题讨论】:
-
这是未定义的行为。
fun(&i)对i有副作用,但您可以在序列点之前的同一语句中访问它。 -
为了绕过未定义的行为,假设你写了
sum1 = (i / 2) + 10;。如果没有优先规则(但推测二元运算符和括号中的子表达式分组仍然存在从左到右的关联性),sum1 = (i / 2) + 10;将被评估为(sum1 = (i / 2)) + 10;。 -
运算符优先级就像自然语言中的语法一样,允许在句子中决定谁是主语,谁是附加主语。没有优先级就像没有语法,在那种情况下你无法理解那句话;-)
-
@bruno Master Yoda 同意不要。
-
@EugeneSh.: 不,行为不是未定义的。在函数参数的评估和函数的调用之间以及函数中的每个完整表达式(包括返回)之后都有序列点。该行为未指定,因为未确定
i/2和fun(&x)之间的评估顺序,但它不是未定义的。
标签: c function operator-precedence rules