關於printf引數與棧的問題的一點認識

2021-07-27 11:09:28 字數 2030 閱讀 9812

關於printf引數與棧的問題的一點認識

然後依次出棧,這樣就與格式符中由左向右一一對應了。

如:printf("%d1 %d2 %d3 %d4", a, b, c, d );

由引數入棧後的順序是;d, c, b, a,所得的棧為:

|a   |<-棧頂

|b   |

|c   |

|d   |<-棧底

他們出棧的順序就是一直出棧,得a, b, c, d這與"

%d1 %d2 %d3 %d4"格式符相對應。

經過參照:

1, ++做字首和做字尾到底有什麼本質區別? - 知乎

上面說: 

編譯器行為的區別 - 

後置

的時候為了能夠返回加之前的值,

編譯器會給你構造乙個臨時變數用於參與整個表示式,2,

++、--前字尾區別 - randomname的專欄 - 部落格頻道 - csdn.net

上面的意思也 就是說,如果a++出現在整個表達中,參與表示式運算的是a的乙個臨時變數。而不是a。a去完成了自增運算。所以

a++;語句可以寫為tmp=a;  ++a;3,

printf 引數入棧順序 - 部落格頻道 - csdn.net

對於a++的結果,是有ebp定址函式棧空間來記錄中間結果的,在最後給printf壓棧的時候,再從棧中把中間結果取出來

也說明了:

a++過程中的這個臨時變數的出處,也就是這個中間變數由ebp定址函式棧空間來記錄的。

同時,也說明,當a++作為printf()的引數壓棧時,壓入的是這個臨時變數,而非變數a。

因此下面的結果也就不難理解了。

a =1

;printf

("%d %d\n",a

,a++);

a =1

;printf

("%d %d %d\n",a

,a++,a

);a =1

;printf

("%d %d %d %d\n",a

,++a,

a++,a);

其結果是

2

1212

331

3

對於第乙個語句:

a  =1;

printf

("%d %d\n",a

,a

++);

壓棧後為:

|a       | <-頂

|tmp = a,| ++a; <-底

正如上所述,因為a++在棧底實際上壓入的是臨時變數tmp = a;而a又完成了自增。

所以出棧時,結果為:2 1

對於第二語句:a=

1;

printf

("%d %d %d\n",a

,a

++,a

);

壓棧後為:

|a       | <-頂

|tmp = a,| ++a;

|a       | <-底

同樣,a++在棧中實際上壓入的是臨時變數tmp = a;而a又完成了自增。

所以出棧時,結果為:2 1 2

對於第三語句

a =1;

printf

("%d %d %d %d\n",a

,++a,

a++,

a);

壓棧後為:

|a       | <-頂

|++a,    | ;

|tmp = a,| ++a;

|a       | <-底

同樣,a++在棧中實際上壓入的是臨時變數tmp = a;而a又完成了自增。

所以出棧時,結果為:3 3 1 3

printf函式的引數壓棧問題

最近看到一些程式設計師的筆試題目,經常會考到printf函式的引數壓棧問題,總體來講就是引數從右向左依次壓棧,再出棧,但是今天看到乙個看似很簡單的題目,卻一直找不到頭緒。題目如下 cpp view plain copy include void main 輸出看似很簡單,但是結果卻打出所料。輸出是 ...

printf函式引數入棧

char p 10 strcpy p,pek printf s n p printf s s n p,strupr p 其中strupr是轉換大小寫的函式,這裡顯示 pek pek pek 為什麼printf s s n p,strupr p 這裡兩個都是大寫的pek,即使用printf s s n...

printf 函式的壓棧問題

我們經常會在程式設計中用到printf這個函式,對於這個函式與scanf函式有相似的地方 或者說是有聯絡 首先我們要先從scanf函式的引數入棧說起,一般ide來說 對c語言 入棧的順序是從右往左進行壓棧 事例一 壓棧相關的簡單例子,如下 include main 那麼這個輸入會是多少呢?我用dev...