0

可能重复:
未定义的行为和序列点

手动编写以下代码:

#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

谁能告诉我哪里出错了?

4

1 回答 1

4
a *= a++;
b *= ++b;

这两个语句在 C 中都是未定义的行为。它们违反了 C 序列点规则。

a *= a++; 

相当于:

a = a * a++;

并且在前一个和下一个序列点之间修改对象两次是 C 中的未定义行为(C99,6.5p2)。

于 2012-10-26T11:54:17.980 回答