Questions tagged «sequence-points»

5
未定义的行为和顺序点
什么是“序列点”? 未定义行为与序列点之间有什么关系? 我经常使用诸如的有趣且令人费解的表情a[++i] = i;来使自己感觉更好。为什么我应该停止使用它们? 如果您已阅读本文,请确保访问后续问题未定义行为和重载序列点。 (注意:这本来是Stack Overflow的C ++ FAQ的一个条目。如果您想批评以这种形式提供FAQ的想法,那么开始所有这些工作的meta上的发布将是这样做的地方。该问题在C ++聊天室中进行监控,该问题最初是从FAQ想法开始的,所以提出这个想法的人很可能会读懂您的答案。)


5
未定义的行为和顺序点已重新加载
将此主题视为以下主题的续集: 上一期文章 未定义行为和顺序点 让我们重新看一下这个有趣而令人费解的表达(斜体字词来自上面的主题* smile *): i += ++i; 我们说这会调用未定义的行为。我相信,当这样说,我们隐含假设型的i是内置的类型之一。 如果什么类型的i是用户定义类型?说它的类型是本文Index后面定义的类型(请参阅下文)。它仍然会调用未定义行为吗? 如果是,为什么?它不等于写作i.operator+=(i.operator++());,甚至在语法上更简单 i.add(i.inc());吗?或者,他们是否也调用未定义行为? 如果没有,为什么不呢?毕竟,对象在连续的序列点之间i被修改了两次。请回想一下经验法则:表达式只能在连续的“序列点”之间修改对象的值一次。如果 i += ++i是表达式,则它必须调用undefined-behavior。如果是,则它的等效项i.operator+=(i.operator++());也 i.add(i.inc());必须调用undefined-behavior,似乎是不正确的!(据我了解) 或者,i += ++i不是一开始的表达方式吗?如果是这样,那么它是什么,expression的定义是什么? 如果它是一个表达式,并且其行为也得到了很好的定义,则意味着与该表达式关联的序列点数在某种程度上取决于该表达式所涉及的操作数的类型。我是否正确(甚至部分正确)? 顺便说一下,这个表情怎么样? //Consider two cases: //1. If a is an array of a built-in type //2. If a is user-defined type which overloads the subscript operator! a[++i] = i; …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.