c++ - (a=1)=2 在 C++98 中是未定义的行为吗?
问题描述
例如类似的代码(a+=1)%=7;
,其中 a 是一个int
变量。
我们知道运算符+=
or=
不是序列点,因此我们在两个相邻的序列点之间有两个副作用。(我们这里使用的是 cpp98 的序列点规则)
但是,赋值运算符喜欢+=
or保证在 assignment 之后=
返回左值,这意味着执行顺序在某种程度上是“定义的”。
那么这是一个未定义的行为吗?
解决方案
(a=1)=2
在 C++11 之前是未定义的,因为=
运算符没有引入序列点,因此a
在没有中间序列点的情况下被修改了两次。这同样适用于(a+=1)%=7
案文是:
在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。
值得一提的是,赋值运算符的描述有缺陷:
赋值操作的结果是赋值后存储在左操作数中的值;结果是一个左值。
如果结果是左值,则结果不能是存储的值(即右值)。左值指定内存位置。这句话似乎暗示了一种排序关系,但无论我们如何解释它,它都没有使用术语“序列点”,因此前面关于序列点的文本适用。
如果有的话,该措辞对诸如(a=1) + 2
. 排序的 C++11 修订版消除了所有这些歧义。
推荐阅读
- azure - Kusto:使用解析运算符时删除不匹配的行
- nxc - 如何在 nxc 中拆分字符串
- python - 在不可迭代函数上执行进度条 - Python
- javascript - 在用户输入的字符串中搜索数组的任何值
- javascript - 当我从终端运行 gulp 脚本时,为什么我的 gulpfile.js 没有编译为 scripts.js?
- kendo-ui - Telerik Kendo UI Of area Chart 如何显示区域的深色
- c++ - 使用构造函数打印特定数字的问题
- javascript - 是否有可能推迟 Fade 的过渡?
- image - 通过 VkSubpassDependency 进行多个附件布局转换
- javascript - 页面刷新时如何保持变量的值