【发布时间】:2015-09-18 15:55:55
【问题描述】:
我一直在复习我未定义的行为规则,并阅读以下内容:
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)未定义行为与“赋值操作的结果是赋值后存储在左操作数中的值;结果是左值”(参考)[https://stackoverflow.com/a/4190054/258418]? (我知道之后 i 的值是未定义的,但如果我正确理解标准,函数调用应该被评估为f(-1, -1)。 - 哪些类型的表达式在 c++11/14/1z 中变得安全,只有简单赋值中的预增量/预减量(没有
op=)?
【问题讨论】:
-
为什么你们这些疯狂的人都坚持写这样的怪物:'(
-
#3 中的“变得安全”是什么意思?
-
@Quentin:我不坚持写这些 montrosities,我可能永远不会靠近它们(我可能写过类似
i=(++i)*x而不是i=(i+1)*x一次,但为了避免这种情况我需要a)意识,b)确保前者是危险的(我同意大多数例子都是丑陋的/构造的)。 -
@interjay:抱歉,我跳过了提到新 c++ 标准的部分(据我所知,c++11 发生了变化)
-
@ted 别担心,你的问题是一个很好的问题(我赞成),我只是在开玩笑说序列点触发行为正在变成的运行噱头的长度,即使没有真正使用这样的结构会受益匪浅:)
标签: c++ language-lawyer