Bront 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 );

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

(606)
Python中open的用法:Python列表:[:] 的用法
上一篇
Python中help:当在Python中调用help(help)时“with atwist”是什么意思
下一篇

相关推荐

  • fortran编译器下载:文件Fortran编译器可以用来编译Fortran程序,一般情况下,使用Fortran编译器生成的标题

    示例示例Fortran编译器可以在官方网站上下载,也可以在各种软件仓库中搜索。具体的下载步骤如下:访问Fortran的官方网站,找到下载选项;…

    2023-04-06 01:48:07
    0 67 72
  • GEKKO-超时错误-ImportError:没有解决方案或服务器无法访问

    我正在尝试使用 GEKKO 解决一个 MINLP 问题。我的代码类似于Gekko:MINLP-Error options.json file not found中呈现的代码。它一直工作得很好,直到今天早上它似乎找不到解决方案。我得到以下错误:(我正在 Windows 上工作)…

    2024-01-29 10:33:30
    0 76 46
  • 编程笔记本配置:开发人员笔记本配置(best developer laptops)

    关于编程笔记本配置的问题,在best developer laptops中经常遇到,我想为外出工作购买一个全新的笔记本。我主要在大型项目 (10 gb 构建) 上使用 V C++ (vs03) 和 c# (vs08) 进行开发。在办公室我有一个带有 10.000 rpm 磁盘的四核 xeon。…

    2024-03-11 04:20:27
    0 31 28
  • 小程序请求接口的api:与TinderAPI接口的所有客户端应用程序

    关于小程序请求接口的api的问题,在gotinder vs tinder中经常遇到,我正在尝试从 tinder 端点获取授权令牌,但我一直运行到 CORS 限制。但是我能够获得 facebook 令牌和用户 ID 没有任何问题。我用 FB.login () 函数获取令牌,然后立即使用$http.post调用 tinder api 端点https://api.gotinder.com/auth传递它{facebook_token:"",facebook_id:""}。但是我获得…

    2024-01-21 14:31:55
    0 30 44
  • 高清代码:高清视频流安全吗 (safe streaming vf)

    关于高清代码的问题,在safe streaming vf中经常遇到,为了能够在我的网站上即时录制和播放音频,我已经设置了 Red5 和 FLV Audio Recorder。现在,我也要实现一个视频解决方案。…

    2024-01-22 02:13:11
    0 17 97
  • 可以看书的软件:在AdobeReader 9中查看书签

    关于可以看书的软件的问题,在adobe acrobat reader bookmark中经常遇到,为什么在 Adobe Reader 9 中无法显示书签面板?…

    2023-11-13 00:59:52
    0 51 68
  • N pap:将FreeRADIUS配置为仅支持EAP TTLSPAP

    关于N pap的问题,在ttls中经常遇到,我有一个只支持 PAP 的外部 RADIUS 服务器。我已经配置了 FreeRADIUS 2.2.4 将 EAP-TTLS 隧道内的 PAP 请求 (从为 WPA2 Enterprise 配置的 WiFi 接入点) 代理到此 RADIUS 服务器,并使用 eapol_test 进行了测试。我可以手动配置 PC 或 Mac 仅发送 EAP-TTLS + PAP,但这并不理想。…

    2023-10-24 14:24:19
    0 87 99
  • 免费看剧的软件:免费的 UML设计软件(uml designer online)

    关于免费看剧的软件的问题,在uml designer online中经常遇到,我已经在纸上做了一段时间的 UML 图了,但是由于显而易见的原因,我想开始以数字方式进行。我已经使用了很多可以做到这一点的软件,但是有些软件过于复杂,有些则不直观。…

    2024-03-04 15:30:14
    0 80 19

发表评论

登录 后才能评论

评论列表(18条)