c – i = i等的未定义行为规则

我一直在研究未定义的行为规则,并阅读以下内容:

Undefined behavior and sequence points
Why is f(i = -1, i = -1) undefined behavior?
Why is `x– > 0` not undefined behaviour, while `x = x–` is?


In C++11, does `i += ++i + 1` exhibit undefined behavior?

最后有三个问题:

>对于i = i形式的术语,未定义的行为规则是否适用于非整数类型? (该表达式应该转换为i.operator(i.operator(i)),并且因为每个函数调用都是一个序列点,所以如果我正确理解了标准,它应该被很好地定义)
>为什么f(i = -1,i = -1)未定义的行为与“赋值操作的结果是赋值发生后存储在左操作数中的值;结果是左值”(ref )[https://stackoverflow.com/a/4190054/258418]? (我知道之后i的值是未定义的,但如果我正确理解了标准,则函数调用应该被评估为f(-1,-1).
>使用c 11/14 / 1z,哪种类型的表达式变得安全,只有简单赋值中的preincrement / predecrement(没有op =)?

最佳答案 忘掉f(i = -1,i = -1).假设你有两个指针int * p和int * q,你调用

f (*p = 1, *q = 2)

如果p == q,这是未定义的行为.如果您不希望它是未定义的行为,那么在p == q的情况下如何定义行为? (因为如果你不喜欢它未定义,你必须以某种方式定义它).此外,您是否接受行为的定义,这意味着99.999%的代码可能会运行得慢一些,以节省一些明显的愚蠢代码?

然后是这样的

f (*p = -1, *q = -1)

因此分配了相同的值.如果您希望将此定义为行为,但不指定不同的值,那么您究竟如何建议将其置于合理的规则中?

点赞