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


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

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

你这条语句在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

++在变量后,是先运算赋值再加加,第一个是c=55,然后再加一.
第二个d=5
5,后c再加一,但跟d就没啥关系了

c = 5 * c++; 这里的c++是先做运算,然后自加。
当你再输出c的时候,他会加一。
如果你改成这样。
c = 5 * ++c;
则输出c的结果未30