baifadaihualang 2022-01-20 23:56 采纳率: 100%
浏览 40
已结题

关于#c++#的问题:递增递减运算符


int c = 5;
c = 5 * c++;
cout << c  << endl; //这里结果是26.

int c = 5;
int d = 5 *c++;
cout << d << endl; //这里结果是25.
我想问为什么第一个的结果是26?第一个为什么和第二个不一样?谢谢。

  • 写回答

3条回答 默认 最新

  • _GX_ 2022-01-21 00:45
    关注

    你这条语句在C++17之前是属于未定义行为,C++17之前没有规定赋值运算符side effect的先后顺序,即这个语句中c++对c加1修改操作(side-effect)和对c赋值25的修改操作(side-effect)的先后顺序是不确定。有的编译器是先给赋值25然后c再加1,这样得到c=26;而有的编译器先c加1,然后给c赋值25,得到c=25。如果把语句改为d=5*c++;,d始终是25,对d赋值和对c加1两个side-effect相互之间不冲突。一个经验规则是最好不要再同一个表达式的不同地方对同一个变量同时读取和修改。

    int c = 5;
    c = 5 * c++; // // undefined behavior until C++17
    cout << c  << endl;
    

    C++17新增了下面这条规则,确保了赋值运算符右侧操作数值计算以及side-effect始终在左侧之前。这样上面的语句结果就始终是c=25
    From https://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior

    1. In every simple assignment expression E1=E2 and every compound assignment expression E1@=E2, every value computation and side-effect of E2 is sequenced before every value computation and side effect of E1
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月31日
  • 已采纳回答 1月23日
  • 创建了问题 1月20日

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序