我正在努力理解C语言中的序列点,只是想确认一些事情。目前,我相信(1)是未定义的,而(2)仅仅是未指定的,因为在(2)中,在评估g
和h
的参数后有序列点(所以我们不会在序列点之间两次修改i
),但是f
的参数的评估顺序仍然是未指定的。我的理解正确吗?
#include <stdio.h>
int g(int i) {
return i;
}
int h(int i) {
return i;
}
void f(int x, int y) {
printf("%i", x + y);
}
int main() {
int i = 23;
f(++i, ++i); // (1)
f(g(++i), h(++i)); // (2)
return 0;
}
编辑:
看起来关键点在于编译器是否可以在调用g
或h
之前执行两个增量--根据下面的答案,我的理解是可以的,但我希望确认一下。