C 中的未定义行为

问题描述

this 网站的最后一节中,他们提供了 f(i = -1,i = -1) 作为未定义行为的示例,这是由于对函数参数中的子表达式进行无序评估。但是由于在对所有函数参数和函数指示符求值之后和实际函数调用之前有一个序列点f 将始终用 (-1,-1)i 将被分配 -1。有没有这种情况不发生的可能性?

解决方法

...求值后有序列点

确实如此。 经过评价,所以没有用。这里的问题是在 i before 序列点上有两个未排序的副作用。它是正式的 UB。

,

这是未定义的行为,因为标准是这样说的。在修改之间没有序列点的情况下修改变量是 UB。规则没有“除非两个修改设置相同的值”例外。