3 回答

TA貢獻(xiàn)883條經(jīng)驗 獲得超454個贊
啊,看了你的描述,我知道你疑惑的點了。你沒搞清楚一個關(guān)鍵知識點(我在給你的另一個回答鏈接中有提到),那就是“表達(dá)式本身是有值”的!
我用下面的代碼片段舉例子:
void?f(int?i) { ????int?a?=?2; ????a?=?i++;
第 4 行的?a = i++ 這個賦值是把誰的值賦給 a?? 答案是:是把“i++ 表達(dá)式”的值賦給 a。
注意“i++ 表達(dá)式”和“變量 i”是兩個東西。它們間的關(guān)聯(lián)只不過是:“i++ 表達(dá)式”的值是 i 自增前的值。 當(dāng)然還有一點聯(lián)系,那就是 i++ 表達(dá)式的副作用會使它的操作數(shù)(也就是變量 i)自增。這個副作用何時確定發(fā)生是由所謂的“序列點規(guī)則”控制的。
但是 a = i++; 這條語句并不受自增副作用發(fā)生時機的影響! 因為 a 被賦予的是“i++ 表達(dá)式”的值,不是“變量 i”的值,變量 i 何時自增并沒有任何關(guān)系,“i++ 表達(dá)式”的值已經(jīng)確定是 i 自增前的值了。 所以 a 的值確定是 3。
當(dāng)然,由序列點規(guī)則可知,在執(zhí)行到分號之后,“變量 i”的值肯定自增了,i 的值變?yōu)?4 了。如果你這時 pirintf 打印 i 的話,會打出 4。
總之,你可以看到,對于 a = i++ 這樣簡單的語句來說,副作用和序列點并不會影響 a 所獲得的值。

TA貢獻(xiàn)883條經(jīng)驗 獲得超454個贊
#include<stdio.h> void?f(int?i) { ????int?a?=?2; ????a?=?i++; ????printf("%d,",?a); } int?main(void) { ????int?a?=?1,?c?=?3; ????f(c); ????a?=?c++; ????printf("%d",?a); }
分析下程序執(zhí)行流程吧:
首先,main 函數(shù)中 12 行處定義了 a 和 c ,它們的初值分別是 1 和 3。
然后 13 行處調(diào)用了函數(shù) f,并且傳入 c 作為實參。我們看第 3 行 f 的定義。注意:函數(shù)參數(shù)是“值傳遞”——函數(shù)的形參 i 只是獲得實參 c 的值,在函數(shù)中改變形參 i 的值并不會影響外面的實參(12 行的 c)。
程序執(zhí)行流程轉(zhuǎn)入函數(shù) f 中:
函數(shù) f 中 5 行處定義了 int 型變量 a。注意:函數(shù)有自己的作用域,這個 a 和函數(shù) f 外面 main 中 12 行的那個 a 沒有任何關(guān)系,僅僅是名字相同而已!
i++ 表達(dá)式的值就是 i 自增前的值。那么形參的值是 3,所以 i++ 表達(dá)式的值也是 3,結(jié)果第 6 行的 a = i++ 使得 a 的值變?yōu)?3。
隨后 printf 會打印出 3。
程序執(zhí)行流程自函數(shù) f 中返回 main:
不管剛才 f 函數(shù)中如何改變形參 i,都不會影響實參 c,所以這時 main 中的變量 c 的值還是 3。
然后 a = c++ 同理,會把 3 賦值給 a。
最后 printf 會再打印出一個 3。
上面的解答中我把一些知識點加粗了。
下次發(fā)代碼時最好用發(fā)帖時的格式化工具格式化一下(像我這樣)
另外,如果對于自增表達(dá)式還有疑惑,請參考我在其他問題中的回答:http://idcbgp.cn/qadetail/83948

TA貢獻(xiàn)883條經(jīng)驗 獲得超454個贊
B
兩個關(guān)鍵知識點:
自增表達(dá)式 a++ 的值就是 a 自增之前的值。
函數(shù)參數(shù)是值傳遞。形參只是獲得實參的值,在函數(shù)中改變形參的值并不會影響到外面的實參。
- 3 回答
- 0 關(guān)注
- 1379 瀏覽
添加回答
舉報