GCC和Borland Turbo C中的不同输出用于printf()语句

时间:2013-09-14 14:32:15

标签: c gcc turbo-c

我在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如何返回不同的输出?

2 个答案:

答案 0 :(得分:4)

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

来自c99 ISO / IEC 9899:TC3 - &gt; Apenndix J:

  

J.2未定义的行为   1在以下情况下,行为未定义:

[...]

  

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

修改

在参考icepacks评论谁告诉turbo c早于c99时,我还添加了

的引用

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

  

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

[..]

  
      
  • 对象被多次修改,或者被修改和访问,而不是在两个序列点(3.3)之间确定新值。
  •   

答案 1 :(得分:2)

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

C99标准6.5。: -

  

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