答案 0 :(得分:16)
问题是Sequence Points。此参数中有两个操作没有序列点,因此对于语句没有已定义的顺序,是首先发生的赋值还是增量?
没有什么说它不安全,它只是未定义,这意味着不同的实现可能会有不同的结果,或者它可能会格式化你的硬盘......
答案 1 :(得分:4)
在同一语句中使用x
和x++
(或++x
)是C中的未定义行为。编译器可以随意执行任何操作:在完成任务之前或之后增加x
。使用Ólafur的代码,它可能会产生f == 5
或f == 6
,具体取决于您的编译器。
答案 2 :(得分:4)
您提供的(cleaned up) link上的文章给出了答案。 “C几乎没有承诺在单个表达式中以可预测的顺序发生副作用。”这意味着您不知道=和++将以什么顺序发生。它取决于编译器。
如果您按照该文章中的链接访问同一站点上有关sequence points的文章,您将看到编译器可以优化将值从寄存器写回变量的内容和时间。
答案 3 :(得分:1)
来自standard
6.5(2)如果标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量值的值计算未被排序 对象,行为未定义。如果有多个允许的排序 表达式的子表达式,如果这样一个未经测序的一方,则行为是不确定的 效果发生在任何排序中。 74)
74)此段落呈现未定义的语句表达式,例如
i = ++i + 1; a[i++] = i;
允许
i = i + 1; a[i] = i;
答案 4 :(得分:0)
我支持亚瑟在这方面的答案。尽管后增量运算符即f ++的实现令人困惑,但它并不被认为是不安全的。你应该先了解编译器如何解释它。是否会在遇到句子终止(;)后或在使用f的值后立即增加f。