我正在寻找C的某个区域,我们在那里得到不同编译器的不同行为。
看下面的代码,我们得到gcc4.4.5中的输出7和tcc4.5中的10。
int i = 0;
i = i ++ + ++ i + i ++ + ++ i;
的printf( “%d”,i)的;
我们是否可以确定我们获得不同行为的其他使用领域,这对于良好的编程实践应该避免。
[注意:上面指定的代码只是一个例子。这个问题并不仅限于此。]
答案 0 :(得分:4)
结果是“编译器相关”,因为就语言而言,它是未定义的行为。
除非另有说明,否则操作数的评估顺序除外 个体经营者和个人的子表达 表达式,以及副作用发生的顺序, 没有具体说明。 在上一个和下一个序列之间 指向标量对象应将其存储值修改为 大多数一次通过表达式的评估。此外, 只能访问先前值以确定该值 存储。应满足本段的要求 对于每个允许的完整子表达式的排序 表达; 否则行为未定义。
答案 1 :(得分:0)
您引用的特定示例i ++ + ++ i根据K& R明确未定义。有一个其他未定义表达式的列表。
答案 2 :(得分:0)
正如Ed指出的那样,C ++规范留下了一些未定义的东西 - 另一个例子是参数的评估顺序。您可能会获得“特定于编译器”的行为,但您更有可能获得更随机的内容(因为其中一些未定义的区域可以使优化更容易)。这只是出于兴趣,还是你想做一些奇怪的事情?