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?。
请注意,运算符优先级和运算符结合性仅保证表达式被解析的顺序!这与操作数的评估顺序无关。 (有一些特殊的例外,例如 || && , ?:
运算符。)
我知道多个表达式是从右到左求值的。 例如:
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?。
请注意,运算符优先级和运算符结合性仅保证表达式被解析的顺序!这与操作数的评估顺序无关。 (有一些特殊的例外,例如 || && , ?:
运算符。)