C中printf内表达式的评估

时间:2016-08-26 08:14:34

标签: c operator-precedence pre-increment

我知道从右到左评估多个表达式。 例如:

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。

有谁可以解释这些表达式是如何评估的?

1 个答案:

答案 0 :(得分:2)

  

我知道从右到左评估多个表达式。

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

此外,在评估函数参数之间没有序列点,因此printf("%d", ++a + a);之类的代码也会调用未定义的行为,请参阅Why are these constructs (using ++) undefined behavior?

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