voi*_*ter 7 c++ sequence-points
可能重复:未
测序的值计算(也称为序列点)
未定义的行为和序列点
运算符优先级与评估顺序
我仍然试图围绕以下表达式如何导致未定义的行为:
a = a++;
Run Code Online (Sandbox Code Playgroud)
在搜索SO时,我发现了以下问题:
我仔细阅读了所有答案,但我仍然对细节有困难.其中一个答案描述了我的上述代码示例的行为在a修改方面是不明确的.例如,它可以归结为以下任何一种:
a=(a+1);a++;
a++;a=a;
Run Code Online (Sandbox Code Playgroud)
究竟什么使a修改变得模棱两可?这是否与不同平台上的CPU指令有关,以及优化器如何利用未定义的行为?换句话说,由于生成的汇编程序,它似乎未定义?
我没有看到编译器使用的原因a=(a+1);a++;,它只是看起来古怪而且没有多大意义.什么会让编译器使它以这种方式运行?
编辑:
为了清楚起见,我确实理解正在发生的事情,我只是不明白当有关于运算符优先级的规则(它基本上定义了表达式的求值顺序)时它是如何被定义的.在这种情况下,赋值最后发生,因此a++需要首先进行评估,以确定要分配的值a.所以我期望的是a,在修复后增量期间首先修改,但随后产生一个值以分配回a(第二次修改).但运算符优先级的规则似乎使我的行为非常清楚,我没有找到任何"摆动空间",因为它有未定义的行为.
您链接的问题中的第一个答案解释了究竟发生了什么.我会尝试改写它以使其更清晰.
运算符优先级通过表达式定义值的计算顺序.表达的结果(a++)很好理解.
但是,变量的修改a 不是表达式的一部分.对真的.这是你无法理解的部分,但这只是C和C++如何定义它.
表达式会产生值,但某些表达式可能会产生副作用.表达a = 1具有值1,但它也有副作用设定可变的a来1.至于C和C++如何定义事物,这是两个不同的步骤.同样,a++具有价值和副作用.
序列点定义何时副作用对在这些序列点之后计算的表达式可见.运算符优先级与序列点无关.这就是C/C++定义事物的方式.
| 归档时间: |
|
| 查看次数: |
581 次 |
| 最近记录: |