0

我在 C 中有一个小代码

#include<stdio.h>
int main()
{
    int a=10,b;
    b=a++ + ++a;
    printf("%d,%d,%d,%d",b,a++,a,++a);
    return 0;
}

Turbo C 给出以下输出(如预期的那样)

22,13,13,13

但是 GCC(在 Windows 中使用 ubuntu 和代码块编译器)给出了以下

22,13,14,14

我相信 Turbo c 的输出是正确的,但是 GCC 怎么会返回不同的输出呢?

4

2 回答 2

4

他们俩都是对的!这是未定义的行为,因为您不允许在一次调用中多次更改相同的值。

从 c99 ISO/IEC 9899:TC3 -> 附录 J:

J.2 未定义行为 1 在下列情况下行为未定义:

[...]

— 在两个序列点之间,一个对象被修改了不止一次,或者被修改并读取了先前的值,而不是确定要存储的值(6.5)。

编辑:

关于告诉 turbo c 早于 c99 的 icepacks 评论,我还添加了来自

C89 标准编程语言 C, X3.???-1988:

A.6.2 未定义行为 以下情况下的行为未定义:

[..]

  • 一个对象在两个序列点 (3.3) 之间被多次修改,或者被修改和访问而不是确定新值。
于 2013-09-14T14:37:57.103 回答
2

这是一种未定义的行为。与在 C 中一样,没有函数参数评估的规范,因此编译器可以以任何方式自由地进行。它是未定义的和任意的。

C99 标准 6.5.:-

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。此外,应仅读取先验值以确定要存储的值。

于 2013-09-14T14:36:26.687 回答