c++ - 考试样本 : why is this variable in C++ producing such an output?

标签 c++

<分区>

Possible Duplicate:
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

谁能告诉我哪里做错了?

最佳答案

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

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

a *= a++; 

相当于:

a = a * a++;

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

关于c++ - 考试样本 : why is this variable in C++ producing such an output?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13086430/

相关文章:

c++ - 作为宏参数的范围内的枚举声明

c++ - 未定义对函数的引用? C++

c++ - 如何在编译时验证模板类是从给定类派生的?

c++ - 如何使用 for_each 获取 vector 中值的索引?

c++ - 如何从命令行编译 Visual Studio 项目?

c++ - 隐藏符号时 dynamic_cast 失败

c++ - 如何处理已存在 key 的插入?

c++ - Symbian 中的可打印字符

c++ - opencv 从缓冲区读取 jpeg 图像

c++ - 将抽象类(仅限纯虚函数)的继承/派生限制在某个类