问题出在序列点上。这个语句中有两个操作没有序列点,因此语句的执行顺序没有定义,赋值先发生还是自增先发生?
并不是说这种情况不安全,只是没有定义,这意味着不同的实现可能会得到不同的结果,或者格式化您的硬盘......
f = f++
的一个不安全的后果。虽然我认为大多数人所说的 '不安全' 并不是指它可能会破坏什么,而是说你不能依赖它会做什么。 - Michael Burr在C语言中,同一条语句中使用x
和x++
(或++x
)是未定义行为。编译器可以任意选择:先在赋值之前还是之后增加x
的值。以Ólafur的代码为例,这可能导致f == 5
或f == 6
,具体取决于你的编译器。
来自标准的内容
6.5(2)如果对标量对象的副作用与同一标量对象上的不同副作用或使用相同标量对象的值计算无序,则行为未定义。如果表达式的子表达式有多个允许的排序方式,并且在任何排序中发生了这样的无序副作用,则行为未定义。74)
74)本段使语句表达式未定义,例如
i = ++i + 1; a[i++] = i;
但允许
i = i + 1; a[i] = i;
在这方面,我支持Arthur的答案。虽然后置递增运算符即f++的实现很令人困惑,但它并不被认为是不安全的。你应该先了解编译器如何解释它,即它是否会在遇到语句终止符(;)后递增f,还是在使用f的值之后立即递增。