虽然这个讨论没什么卵用,但好奇心的驱使,如果你也和我一样,那就往下看吧。
为了方便我在这int a=3,b1,b2,b3,b4;主要观察b的输出来判断我们的想法是否正确
思考:
b1=(a++)+(a++);
b2=(a++)+(++a);
b3=(++a)+(++a);
b4=(++a)+(a++);
依据我们比较普遍的准则:a++先用后加(这加是什么时候加?再次调用加,还是这一行命令结束后?),++a先加后用
a++先用命令结束后加:
b1=3+3=6,b2=3+4=7,b3=4+5=9,b4=4+4=8
a++先用再次调用加:
b1=3+4=7,b2=3+5=8,b3=4+5=9,b4=4+4=8
看了这两行,是不是已经蒙了,我以为a++是先用后加,++a是先加后用已经没有bug了,可现在看来只是没有遇到而已,不多说了,直接给答案:
b1=6,b2=8,b3=10,b4=8
貌似两次答案都能对个百分之五十,可我们应该尽自己可能去把握已知的,所以让我们深入理解它
为了更好的理解,我对应的写出上面简单的过程,希望有帮助b1=3+3,b2=4+4,b3=5+5,b4=4+4
我先不解释,继续来看int b5=(++a)+(++a)+(++a)+(++a);
这时b5的值是多少呢?b5=7+7+7+7=28?
正确答案是b5=23,a=7。
这里真实的运算规则是:
由于加法运算符“+”是二元运算符,所以每次运算都只需要2个操作数,运算后结果保存在一个缓存变量ans中。
所以先运算(++a)+(++a),则结果为ans=5+5=10,a=5;
然后再运算ans+(++a),则结果为ans=10+6=16,a=6;
然后再运算ans+(++a),则结果为ans=16+7=23,a=7;
然后赋值b5=ans=23;
看到这里明白了吧,其实结合逆波兰表达式的堆栈求解方法很容易理解这个问题。
不要误以为b5=(++a)+(++a)+(++a)+(++a)就是单纯运算4次自加后,a和a之间的加法
理解了这个加上之前知道的a++先用后加(行命令结束后可以自行测试,简单的讲就是:忽略所有的i++操作符,先进行运算,等表达式的值求解完成后,才对相应的变量进行自加。),++a先加后用就可以来做一下下面这道题了
int a=3;
int b0=(a++)+(++a)+(a*10);
没错就是 4+4+40=48
最后自减“--”也是同样,如果功力深厚,可以考虑看汇编代码,更好的知道语言运算的机制。
下面是我公众号,希望有更多有趣的朋友来