C 中 printf 中表达式的求值

Evaluation of Expressions inside printf in C

我知道多个表达式是从右到左求值的。 例如:

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。

谁能解释一下这些表达式是如何求值的?

I know that multiple expressions are evaluated from right to left.

没有。函数参数的评估顺序是未指定的行为。这意味着您无法知道顺序,它可能因系统而异,甚至因函数调用而异。您永远不应该编写依赖于这种计算顺序的程序。

此外,函数参数的求值之间没有顺序点,所以像printf("%d", ++a + a);这样的代码也会调用未定义的行为,参见Why are these constructs (using ++) undefined behavior?

请注意,运算符优先级和运算符结合性仅保证表达式被解析的顺序!这与操作数的评估顺序无关。 (有一些特殊的例外,例如 || && , ?: 运算符。)