Penal is e:复合赋值E1op=E2不等同于E1=E1opE2

cppreferencesays:

每个内置复合赋值表达式E1 op= E2的行为(其中E1是一个可修改的左值表达式,而E2是一个右值表达式或一个带括号的 init 列表(因为 C ++ 11))与表达式E1 = E1 op E2的行为完全相同E1

我想知道这个解释是错误的(不足)还是我理解不正确。

我理解E1 = E1 + E2E1 += E2之间有固有的区别,解释为here

#include<iostream>
int main() {
    int x;
    x = 1;
    x += (-1) ? 2 : 2; 
    std::cout << x << std::endl; //prints 3
    x = 1;
    x = x + (-1) ? 2 : 2;
    std::cout << x << std::endl; //prints 2
    x = 2;
    x += (-2) == 0;
    std::cout << x << std::endl; //prints 2
    x = 2;
    x = x + (-2) == 0; // prints 1
}

我的猜测是E1 op= E2有以下行为:

评估E1E2(不确定顺序),并将两次评估之间的运算结果分配给E1,即(E1) = (E1) op (E2)

那么,对复合赋值运算的行为的更好解释是(E1) = (E1) op (E2)?(或E1 = E1 op (E2),因为E1只能具有比赋值运算符更高的优先级和比 op 运算符更低的优先级的运算符,如果E1 op (E2)想要产生与(E1) op (E2)不同的结果。不存在其结果是可修改的 lvalue 的运算符)。

4

来自 cppreference 的引用直接来自 C ++ 标准:

[expr.ass]/6

E1 op= E2形式的表达式的行为应完全等同于E1 = E1 op E2,但E1只计算一次。
如果E1具有volatile-qualified类型,则不建议使用此类表达式;请参阅[depr.volatile.type]
对于+=

在这种情况下,the term expression has already been definedE1 op= E2等同于E1 = E1 op E2显然并不意味着表达式在文本表示上是等效的,而是在分辨率(类型,值和副作用)上。

[A] 更好的解释复合赋值操作的行为可能是(E1)=(E1)OP(E2)?

我只能表达我的观点:我认为cpprederence 页面在这里引用标准是正确的,但是可以添加注释以确保读者不会弄错。

4

这是关于运算符优先级。+具有比三元条件更高的优先级 (还有==)。所以这:

x = x + (-1) ? 2 : 2;

是这样评估的:

x = (x + (-1)) ? 2 : 2;

这就是为什么你得到2而不是3

x = x + (-2) == 0

被评估为

x = (x + (-2)) == 0 // (x + (-2)) is 0, 0 == 0 is 1

所以拿第一个例子:

x = x + (-1) ? 2 : 2;

这里AxB(x + (-1) ? 2 : 2)x加上三元运算的结果)

然而,在这里

x += (-1) ? 2 : 2; 

Ax,而B只是三元运算的结果。AB由于+=的优先级低于=而发生了变化。因此,关于 E1 = E1 E2 和 E1 = E2的说法是相同的,

0

根据 C ++ 标准(8.5.18 赋值和复合赋值运算符)

7 形式为 E1 op = E2 的表达式的行为等同于 E1 = E1 op E2,除了 E1 只计算一次。在 + = 和-= 中,E1 应具有算术类型或指向可能是 cv 限定的完全定义的对象类型的指针。在所有其他情况下,E1 应具有算术类型。

和 (8.5.6 加法运算符)

1加法运算符 + 和-从左到右分组。通常的算术转换(8.3)是针对算术或枚举类型的操作数执行的。

这些表达式语句

x = x + (-1) ? 2 : 2;
x += (-2) == 0;
x = x + (-2) == 0;

相当于

x = ( x - 1 ) ? 2 : 2;
x += ( -2 == 0 );
x = ( ( x - 2 ) == 0 );

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(20)
万能u盘低格工具:为什么康威的生命游戏可以被归类为万能机器
上一篇
万能表使用教程:为什么康威的生命游戏可以被归类为万能机器
下一篇

相关推荐

  • java线程通信方式:使用wait/notify机制实现线程间的同步通信

    Java线程通信方式是指多个线程之间如何进行数据交换的方式。它可以通过共享变量、等待/通知机制、管道流和Socket等方式实现。…

    2023-03-25 06:42:36
    0 60 56
  • win7安装程序正在应用系统设置安装程序的应用

    Windows 安装程序正在应用系统设置的过程中,会提供一些代码,用来帮助用户安装和配置 Windows 系统。其中,最常见的代码是“”,这个代码表示 Windows 安装程序无法识别安装介质上的文件,通常是由于介质上的文件已损坏而导致的。…

    2023-04-19 05:01:40
    0 49 88
  • catens是什么牌子高品质的时尚服装品牌

    Catens是一个英国品牌,专注于设计和制造高质量的服装和鞋子。它提供各种风格的服装,以满足不同年龄段的人们的需求。Catens的产品包括T恤、衬衫、外套、裤子、裙子、鞋子等。Catens的代码是CTNS。…

    2023-06-20 06:21:22
    0 47 77
  • win10防火墙阻止某个程序怎么解除(含代码示例)

    解除win10防火墙阻止某个程序的方法如下:打开“设置”,点击“更新与安全”,然后点击“防火墙与网络保护”。…

    2023-06-06 02:42:57
    0 52 23
  • 工业ai:快速AI拉动快速AI(pulling a fast one)

    关于工业ai的问题,在pulling a fast one中经常遇到,通常情况下,像from module import *这样的语句会被专业的 python 程序员皱眉,因为它们会导致命名空间混乱。然而,它们在快速人工智能中很常见,理由是它让学生的生活更简单。下面是their book的摘录…

    2024-03-28 11:19:27
    0 45 59
  • Xao77论坛:进口指数 XAO价格到谷歌工作表(indexasx xao)

    关于Xao77论坛的问题,在indexasx xao中经常遇到,我正在尝试将 asx all ords (INDEXASX:XAO) 价格加载到 Google 工作表单元格中。大多数股票返回像下面的必和必拓这样的结果,但无法获得像 XAO 这样的指数工作。…

    2024-01-18 10:35:34
    0 74 31
  • Flat land:如何根据深度信息找到平坦区域

    关于Flat land的问题,在flat land images中经常遇到,我有一架可以自主飞行的无人机,我希望它安全着陆。我在它下面有一个深度相机,现在我找不到检测平坦区域的方法来告诉无人机降落在它上面。…

    2024-03-25 04:23:42
    0 75 66
  • In xn i:xn--ondomain 是什么意思

    关于In xn i的问题,在on domain中经常遇到,我想知道 xn--(domain)-66b.com 在一个域中意味着什么。例如,我用 ñ 购买了 disi ñ olatinoamericano.com。…

    2023-10-17 16:19:37
    0 86 92

发表评论

登录 后才能评论

评论列表(22条)