C語言中引數執行順序及a 與 a實現的區別

2021-07-05 18:33:11 字數 1003 閱讀 7691

首先結論:(1)void func(int a, int b, int c, int d)中引數按dcba,即從右至左的順序依次入棧。

(2)printf("%d, %d\n",(a++)*a,a+=2)中從右至左依次計算。

即使(1)(2)情況下,引數都是從右到左的依次被執行。

(3)a++先使用a的值再自增,產生臨時變數,++a先自增再使用新的a的值,不產生臨時變數。

關於這一點可在下面的程式中詳細體現。

#include using namespace std;

void func(int a, int b, int c, int d)

int main()

首先printf中,從右到左依次計算表示式的值,再從左往右依次輸出(2)。這裡需要注意的是a+=2, 實際上是要輸出&a位址上的值,所以即使在第一次計算中這一部分的值為4, 但是在(a++)*a中a的值被增加為5,所以在輸出時a+=2這一部分的輸出為5。

結果如圖

接下來看2個func的輸出,func(b++,b,b++,b++),執行後結果為4 5 3 2,這裡參見第一條(1)函式的引數從右往左依次入棧,同時注意到第二個引數b是要輸出&b上的值,所以在第乙個引數b++改變b的值後,第二個引數仍會改變。

但是func(++c,c,++c,++c),執行後4個輸出全為5就讓我疑惑了好一陣了,最終我找到了第三條解釋(3),即關於a++和++a實現原理的不同,a++先使用a的值再自增,產生臨時變數,所以在func(b++,b,b++,b++)中每乙個b++都會產生乙個臨時變數,最終printf輸出的時臨時變數位址上的值,所以3個b++之間並不相互影響,各自會輸出入棧時狀態的值。 而++a先自增再使用新的a的值,不產生臨時變數,所以func(++c,c,++c,++c),中4個引數都是要輸出&c位址上的值,他們的變化相互影響,所以最終輸出c的值,即結果為4個5.

C語言中函式引數的入棧順序詳解及例項

c語言中函式引數的入棧順序詳解及例項 對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給...

C語言中不用巨集實現變長引數函式的原理及實現

一 前言 我們通常編寫的函式都是引數固定的,多了少了都會有錯,但是有時候我們是不能確定預先需要多少個引數的,而變長引數函式恰恰就能解決我們的問題。在unix中,提供了變長引數函式的編寫方法,主要是通過va list物件實現,定義在檔案 stdarg.h 中,變長引數函式的編寫有乙個固定的模板,模板很...

C語言printf及引數壓棧順序

1.呼叫格式為 printf 格式化字串 參量表 其中格式化字串包括兩部分內容 一部分是正常字元,這些字元將按原樣輸出 另一部分是格式化規定字元,以 開始,後跟乙個或幾個規定字元,用來確定輸出內容格式。參量表是需要輸出的一系列引數,其個數必須與格式化字串所說明的輸出引數個數一樣多,各引數之間用 分開...