一位朋友让我简单地解释一下运算符优先级和求值顺序之间的区别。我是这样向他们解释的:-
让我们举个例子——
int x;
int a = 2;
int b = 5;
int c = 6;
int d = 4;
x = a * b / (c + d);
Run Code Online (Sandbox Code Playgroud)
在这里, 的最终值x将变为1。c这是因为,首先将和 的值d相加( ),然后将和6+4的值相乘(),最后进行除法(),最终值变为,然后将其赋值到。ab2*510/101x
所有这些都是由运算符优先级指定的。在此示例中,括号强制加法在乘法和除法之前进行,即使加法的优先级较低。另外,乘法是在除法之前执行的,因为乘法和除法具有相同的优先级,并且两者都具有从左到右的结合性。
现在到了重要的部分,即该表达式的求值顺序。
在一个系统上,求值的顺序可能是这样的 -
/* Step 1 */ x = a * b / (c + d);
/* Step 2 */ x = a * 5 / (c + d);
/* …Run Code Online (Sandbox Code Playgroud) 根据this answer,以下是标准中描述的序列点:
在函数调用和实际调用中的函数指示符和实际参数的评估之间;
在运算符 &&、|| 和 , 的第一个和第二个操作数的计算之间;
在条件 ?: 运算符的第一个操作数的评估与第二个和第三个操作数中的任何一个评估之间;
完整声明符的结束;
在完整表达式的求值和要求值的下一个完整表达式之间。以下是完整的表达:
在库函数返回之前;
在与每个格式化输入/输出函数转换说明符相关联的动作之后;
在每次调用比较函数之前和之后,以及在对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。
该标准从未明确提到分号是一个序列点,但是已经说明的各种序列点暗示分号确实是一个序列点。
那么,分号是在break;还是continue;序列点中?