C编译器的行为差异示例

时间:2011-02-11 06:19:52

标签: c

我正在寻找C的某个区域,我们在那里得到不同编译器的不同行为。

看下面的代码,我们得到gcc4.4.5中的输出7和tcc4.5中的10。

  

int i = 0;
  i = i ++ + ++ i + i ++ + ++ i;
  的printf( “%d”,i)的;

我们是否可以确定我们获得不同行为的其他使用领域,这对于良好的编程实践应该避免。

[注意:上面指定的代码只是一个例子。这个问题并不仅限于此。]

3 个答案:

答案 0 :(得分:4)

结果是“编译器相关”,因为就语言而言,它是未定义的行为。

  

除非另有说明,否则操作数的评估顺序除外       个体经营者和个人的子表达       表达式,以及副作用发生的顺序,       没有具体说明。 在上一个和下一个序列之间       指向标量对象应将其存储值修改为       大多数一次通过表达式的评估。此外,       只能访问先前值以确定该值       存储。应满足本段的要求       对于每个允许的完整子表达式的排序       表达; 否则行为未定义。

答案 1 :(得分:0)

您引用的特定示例i ++ + ++ i根据K& R明确未定义。有一个其他未定义表达式的列表。

答案 2 :(得分:0)

正如Ed指出的那样,C ++规范留下了一些未定义的东西 - 另一个例子是参数的评估顺序。您可能会获得“特定于编译器”的行为,但您更有可能获得更随机的内容(因为其中一些未定义的区域可以使优化更容易)。这只是出于兴趣,还是你想做一些奇怪的事情?