我知道从右到左评估多个表达式。 例如:
int i = 0;
printf("%d %d %d", i, i++, i++); // Prints 2 1 0
但是当涉及到要评估的每个表达式时,如果它是从右到左,反之亦然,我就得不到。
int main()
{
int a = 1, b = 1, d = 1;
printf("%d", a + ++a); // Result = 4
}
考虑从左到右的评估,前面的代码应评估为1 + 2 = 3
int main()
{
int a = 1, b = 1, d = 1;
printf("%d", ++a + a); // Result = 4
}
这应该评估为2 + 2 = 4
但在这两种情况下,答案都是4。
有谁可以解释这些表达式是如何评估的?
答案 0 :(得分:2)
我知道从右到左评估多个表达式。
没有。函数参数的评估顺序是未指定的行为。这意味着不能知道顺序,它可能因系统而异,甚至可能因函数调用而异。你永远不应该编写依赖于这种评估顺序的程序。
此外,在评估函数参数之间没有序列点,因此printf("%d", ++a + a);
之类的代码也会调用未定义的行为,请参阅Why are these constructs (using ++) undefined behavior?。
请注意,运算符优先级和运算符关联性仅保证解析表达式的顺序!这与操作数的评估顺序无关。 (有一些特殊例外,例如|| && , ?:
运算符。)