您好,是這樣的;函數(shù)在傳參時(shí)是先傳右面的,所以導(dǎo)致結(jié)果為0;
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到新樂(lè)網(wǎng)站設(shè)計(jì)與新樂(lè)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋新樂(lè)地區(qū)。
如果改為p = f ( ++i, i ); 結(jié)果就不同了;請(qǐng)采納
樓主您好,首先您要理解一下i++的行為,即先用i,然后再++,所以,傳遞參數(shù)時(shí)先用i=1的值,用完了然后++,即先用x=y=1=i,然后i=2;我把程序給您改一下,你就會(huì)根據(jù)結(jié)果看的很明白了。
#include
stdio.h
int
f(int
x,int
y)
{
printf("x=%d\n",x);//顯示傳遞過(guò)來(lái)的i值
printf("y=%d\n",y);
//顯示傳遞過(guò)來(lái)的i++值
if(xy)
return
1;
else
if(xy)
return
-1;
else
return
0;
}
int
main()
{
int
i=1;
int
k;
k=f(i,i++);
printf("i=%d\n",i);//顯示執(zhí)行完函數(shù)后i的值
printf("k=%d\n",k);
return
0;
}
結(jié)果:x=1
y=1
i=2
k=0
樓主您的部分理解是對(duì)的,而結(jié)果有時(shí)候跟編譯器有關(guān),它的編譯順序是不一樣的。
f(++i,i)
和f(i,++i)運(yùn)行結(jié)果都與理解一致,
f(i++,i)
和f(i,i++)運(yùn)行結(jié)果與理解不一致;++是一種縮寫(xiě),對(duì)于y=i++,就是y=i,然后i=i+1;對(duì)于y=++i,就是i=i+1,然后y=i.
樓主fun(m+3,m++);與fun(m+3,++m);都是所謂“實(shí)現(xiàn)未定義的”
關(guān)于實(shí)現(xiàn)未定義,請(qǐng)參看我的另一篇回答:
本例中涉及函數(shù)調(diào)用前的參數(shù)求值順序,ANSI C又有規(guī)定:函數(shù)參數(shù)求值順序是不確定的,編譯器制造者可以隨意實(shí)現(xiàn)。大多數(shù)主流編譯器求值順序都是從右向左。你所使用的編譯器對(duì)這兩例語(yǔ)句輸出的結(jié)果表明它是從右向左求的。
fun(m+3,m++);中先求得m++,它返回m后編譯器有兩種選擇:一種先求得m+3再m自增,一種先自增再求得m+3。遺憾的是,這也是未定義的,編譯器可以隨意做出選擇。你的編譯器選擇了前者,得到的結(jié)果是8,5。
對(duì)后一個(gè)調(diào)用應(yīng)該是沒(méi)什么疑惑了。注意,疑惑都是產(chǎn)生于x++,像++x這種代碼是明明白白的。所以盡量不要在復(fù)雜表達(dá)式中用后置自增自減
函數(shù)的參數(shù)調(diào)用和傳遞是這樣的:
調(diào)用子程序或函數(shù)
參數(shù)順序(一般是倒序)壓入堆棧:如果是數(shù)據(jù),直接壓棧;如果是表達(dá)式,求取其值后將值壓棧;變量則將其值取出壓棧
進(jìn)入子程序,子程序分配存放在堆棧中的各數(shù)據(jù)以臨時(shí)變量名,這些變量名就是函數(shù)頭部的參數(shù)名,子程序中用這些臨時(shí)變量名進(jìn)行運(yùn)算
如果函數(shù)有返回值,返回時(shí)需要提供一個(gè)返回值,存放在指定位置(一般是個(gè)通用寄存器),然后丟棄堆棧中的數(shù)據(jù)(包括調(diào)用時(shí)壓棧的那些參數(shù)),返回調(diào)用者調(diào)用位置之后繼續(xù)運(yùn)行
正常應(yīng)該是從左到右的,我的機(jī)器上運(yùn)行結(jié)果是2,3,3。
可能有些編譯器比較特別從右到左也是有可能的,但是我見(jiàn)過(guò)的編譯器都是從左到右的。
當(dāng)實(shí)參列表包括多個(gè)實(shí)參時(shí),對(duì)實(shí)參的求值順序是不確定的,
有的系統(tǒng)按自左至右順序求實(shí)值,
有的系統(tǒng)則安自右至左的順序。
許多C版本(如turbo
c
和ms
c)是自右而左的順序求值
(見(jiàn)譚浩強(qiáng)C語(yǔ)言程序第二版p150)
故上述程序先算i++,
第二個(gè)參數(shù)的值為i=2之后i的值變?yōu)?,
再將i代入第一個(gè)參數(shù),
故兩個(gè)參數(shù)的值分別為3,2,所以計(jì)算結(jié)果為1