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