在 C 中使用 ++ 运算符执行 printf
考虑 C 语言中的以下语句并预测其输出。
printf("%d %d %d", i, ++i, i++);
此语句通过引用参数列表中的“i”和“i++”来调用未定义的行为。它没有定义评估参数的顺序。不同的编译器可能会选择不同的顺序。单个编译器也可以在不同的时间选择不同的顺序。
例如,下面三个 printf() 语句也可能导致未定义的行为:
C
// C Program to demonstrate the three printf() statements
// that cause undefined behavior
#include
// Driver Code
int main()
{
volatile int a = 10;
printf("%d %d\n", a, a++);
a = 10;
printf("%d %d\n", a++, a);
a = 10;
printf("%d %d %d\n", a, a++, ++a);
return 0;
}
输出
11 10
10 10
12 11 11
解释:通常, 编译器从右到左读取 printf() 的参数。因此,'a++' 将首先执行,因为它是第一个 printf() 语句的最后一个参数。它将打印 10。虽然,现在值已经增加了 1,所以倒数第二个参数,即,将打印 11。同样,其他语句也将被执行。
Note: In pre-increment, i.e., ++a, it will increase the value by 1 before printing, and in post-increment, i.e., a++, it prints the value at first, and then the value is incremented by 1.
因此,不建议在同一个语句中不要做两个或两个以上的前置或后置自增运算符。这意味着在这个过程中绝对没有时间顺序。参数可以以任何顺序进行评估,并且它们的评估过程可以以任何方式交织在一起。