请问这里面是先运行a++呢还是先运行++a呢,为什么呢



```c++

2*a+++++a*4


请问这里面是先运行a++呢还是先运行++a呢,为什么呢

```

表达式可以看成(2i++)+ (++i4),接下来就是判断先运行左边还是右边,下面引用这篇文章
https://blog.csdn.net/weixin_40539125/article/details/93793670
到这里,我们已经知道了表达式的两个行为特征了,如下:

  1. 复合表达式是会考虑优先级和结合律的。

  2. 运算对象的求值顺序与优先级、结合律没有关系。

大多数运算符都没有规定表达式中运算对象的求值顺序,对于互不影响的函数之间,这并没有什么问题,但如果这几个函数共同影响同一个全局变量就会出现问题。

因此在C++ Primer第五版的123页中才会有这么一说:

“因为表达式的行为不可预知,因此不论编辑器生成什么样的代码程序都是错误的。”
是的,因为求值顺序没有规定,怎么样都有可能,这样的代码即使语法毫无问题,他也是错误的!

所以有两条经验准则用于书写复合表达式:

  1. 拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求。

  2. 如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767%EF%BC%8C http://bbs.csdn.net/topics/370153775
计算机组成原理→Shell命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!)
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!