手动编制以下代码:
#include <stdio.h>
int func (int a, int b) {
static int c = 1;
return a + b * (c *= -1);
}
int main () {
int a = 2, b = 3;
int c = func(a, b);
a *= a++;
b *= ++b;
printf("%d %d %d %d\n", a, b, c, func(a, b));
}
我计算printf()
中的变量如下:
a = 5, b = 16, c = -1, func(a, b) = -11
然而我的编译器告诉我最后一个值实际上是21。
输出:
a = 5, b = 16, c = -1, func(a, b) = 21n
我将我的价值计算为(16*-1) + 5
谁能告诉我哪里出错了?
答案 0 :(得分:4)
a *= a++;
b *= ++b;
这两个语句都是C中的未定义行为。它们违反了C序列点规则。
a *= a++;
相当于:
a = a * a++;
并在前一个和下一个序列点之间修改对象两次是C中的未定义行为(C99,6.5p2)。