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日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来