printf函式的引數壓棧問題

2021-07-04 07:58:14 字數 393 閱讀 4275

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

[cpp]view plain

copy

#include 

void

main()    

輸出看似很簡單,但是結果卻打出所料。輸出是「3 3 3 5」。

似乎僅僅從壓棧順序上很難解釋清楚,google找到了事情的真相:

「對於a++的結果,是有ebp定址函式棧空間來記錄中間結果的,在最後給printf壓棧的時候,再從棧中把中間結果取出來;而對於++a的結果,則直接壓暫存器變數,暫存器經過了所有的自增操作。」

原文請見: 

printf 函式的壓棧問題

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

printf 函式壓棧方式

c語言,c 函式呼叫壓棧方式取決與編譯器。但是一般編譯器是右序壓棧的。下面介紹一下c 語言是如何右序壓棧的 如下函式 include int main 一般人會認為輸出結果是 3,4 5 可是實際結果卻是 4,3 5 為什麼呢,原因就取決於c 語言的函式壓棧方式是右序的。在比如有 int x 2 y...

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...