printf函式引數入棧

2021-06-25 09:45:02 字數 978 閱讀 4458

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", strupr(p), p);,回顯也是[pek] [pek]。

是說printf函式中的引數若有函式,則先執行這個函式,再將返回值作為printf的引數?謝謝!

這個現象確實存在,但並非在printf()函式中要先執行函式的原因。這可以用下面的**作試驗,證明不是這個原因。

#include "stdio.h"//。

int add1(int *p)

void main(void)

這段**的執行結果是[2] [1],說明並沒有先執行函式add1()。而如果把printf("[%d] [%d]\n",add1(&a),a)改為printf("[%d] [%d]\n",a,add1(&a))則結果是[2] [2]。這個結果也說明printf()函式確實是從引數列表的右端開始執行的。

那麼造成題目中的現象是什麼原因呢?這是由c/c++對陣列的處理機制造成的。printf()函式在處理陣列時只把陣列首位址壓入棧而並不壓入陣列下標變數的所有內容(因為沒有必要,有首位址就可以輸出了)。當printf()函式從引數列表的右端開始一項一項運算壓棧到最左端的乙個引數後,又從左端的控制符開始按控制符指令一項一項對應彈出。對於其他變數來說,壓入的是值,原來計算的結果是什麼,彈出的就是什麼;而題目中的字串則不然了,先壓入首位址p時,儘管p指向的內容是大小寫並存的,但接著被strupr(p)變成全大寫了,但壓入的首位址還是由strupr(p)返回的同乙個位址,彈出來輸出時這個位址開始的字串已全是大寫字母了……

printf函式的引數壓棧問題

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

語言中函式引數的入棧順序

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

語言中函式引數的入棧順序

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