更新時間:2016年03月29日16時57分 來源:傳智播客 瀏覽次數(shù):
下面我們來看2個案例,分析下c語言中函數(shù)參數(shù)處理順序。
第一個:
#include "stdio.h"
void fn(int a,int b,int c)
{
printf("%d,%d,%d", a, b, c);
}
void main()
{
int a = 3;
fn(a++, a++, a++);
}
輸出結(jié)果:
5,4,3
原因分析:
C函數(shù)參數(shù)作為一個整體執(zhí)行的順序是從右向左,所以會先處理最右端的參數(shù),然后依次向左處理。所以結(jié)果為最右端的a++先被處理結(jié)果為3,然后++,接著4和5,這樣就有了上面的結(jié)果。
第二個:
#include
int main(void)
{
int i = 0;
printf("%d,%d,%d,%d,%d\n", ++i, ++i, i++, ++i, i++);
}
輸出結(jié)果:
5,5,2,5,0
原因分析:
和上面的一樣,執(zhí)行的順序是從右向左,所以會先處理最右端的參數(shù),然后依次向左處理。不同是出現(xiàn)了++i,對于i++和++i是先加與后加的區(qū)別,但是在參數(shù)處理上則對應(yīng)。如果是i++那么表示符合從右向左處理的前提下,當(dāng)即處理該參數(shù)。如果是++i,那么表示只是執(zhí)行++i運(yùn)算并不將結(jié)果作為參數(shù)結(jié)果,將參數(shù)位置壓入堆棧,只有當(dāng)所有參數(shù)從右向左處理完畢之后,從堆棧彈出所有因?yàn)檠雍蟛僮髡Z句而沒有填入最終結(jié)果的參數(shù)位置,將最終執(zhí)行的結(jié)果i,作為相應(yīng)的參數(shù)值,填入進(jìn)去。
現(xiàn)在大家回憶下,逗號運(yùn)算符,逗號運(yùn)算的結(jié)合性是從左至右,完畢之后整個表達(dá)式的值是最后一個表達(dá)式的值。
例子:
int a[2],x=2,y=5;
a[0]=(x+3,y++,x++);
那么最終結(jié)果是:
a[0]=2 x=3 y=6;
從上面分析可以看出,函數(shù)參數(shù)和逗號運(yùn)算符的執(zhí)行順序正好相反!