考试样本:为什么C ++中的这个变量产生这样的输出?

时间:2012-10-26 11:52:46

标签: c++

  

可能重复:
  Undefined Behavior and Sequence Points

手动编制以下代码:

#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

谁能告诉我哪里出错了?

1 个答案:

答案 0 :(得分:4)

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

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

a *= a++; 

相当于:

a = a * a++;

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