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 AttributeError: 'NoneType' object has no attribute 'drop_duplicates'报错
  • ¥15 编写c++计算器,用类和栈来做,要求如下
  • ¥15 以下代码,运行结果报错
  • ¥15 Vivado仿真数据出错
  • ¥15 银河麒麟不支持vant等前端框架怎么办?
  • ¥15 vue3的子组件在父页面调用不显示不生效问题
  • ¥15 cadence PEX
  • ¥15 phython创建了文件 显示在项目下面,但运行不了,运行时还是运行main文件,并且说main文件不允许并行运行
  • ¥15 FutureWarning:不推荐使用空或全 NA 条目的 DataFrame 串联行为。怎么改呢?
  • ¥15 Chatgpt突然无法正常显示数学公式,如何解决?