關於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
1
212
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...