前两楼有提到这个问题与第八诫相关
不过第八诫可能有些不够清楚
https://reurl.cc/0nZmk
https://reurl.cc/YQ0D4
这两篇看完就可以解开你心中的疑惑
时间有限,让我为你简单整理一下部分内容
先从简单的四则运算开始
int ans = 1+2+3+4;
ans是10
原因是加法的结合方向(associativity)
加法的结合方向是向左,可得到:
(((1+2)+3)+4)
*下方有结合方向的补充
再来复杂一点的
int ans = 1*2+6/3;
ans是4
因为((1*2)+(6/3))而不是(1*(2+6)/3)
是由于乘法(*)运算子优先权(precedence)较加法(+)高
国小四则运算口号:
先乘除,后加减,括号要先算
根据口号,但是要先算(1*2)还是(6/3)?
两个括号的结果互相'独立',其中一个先算不影响答案
1 * 2 = 2不影响后面的(6/3),这就是我指的独立
回到你问的两个例子
c = sub1(a,&b)+sub2(&a,b);
是加号左边先还是右边先算(先求值)
'先算'涉及求值顺序(Order of evaluation)
求值顺序没有'左到右'或'右到左'的顺序
printf("%d\n%d\n%d\n%d\n",a+b+c+d,(b*=a),(a+=d),(d++));
a+b+c+d, (b*=a), (a+=d), (d++)
以上四个求值地位相同,不会有哪个求值一定会先做
由于一个向左,一个向右,加上国小口号
让你误会存在'执行顺序方向',实际上执行顺序是假议题
没有一个执行顺序方向,各自表述的空间
是因为你的求值并非'独立',所以你才被电脑(可能是编译或是执行时期)误导
希望你看完,更能体会第八诫字句的含意(以下为第八诫节录)
当一段程式码中,某个变量的值用某种方式被改变一次以上,
例如++x/