溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用代碼實例解析C/C++多參數函數參數的計算順序與壓棧順序

發布時間:2020-07-20 14:24:36 來源:億速云 閱讀:189 作者:小豬 欄目:編程語言

這篇文章主要用代碼實例解析C/C++多參數函數參數的計算順序與壓棧順序,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

一、前言

今天在看Thinking in C++這本書時,書中的一個例子引起了我的注意,具體是使用了下面這句

用代碼實例解析C/C++多參數函數參數的計算順序與壓棧順序

單看這條語句的語義會發現僅僅是使用一個簡單的string的substr函數將所得子串push_back到strings。但是在閱讀時我卻對于substr的參數傳遞產生了疑惑,到底是先執行了++current,還是先執行了last-current?

經過查閱資料,發現了兩個相關知識點----參數的計算順序與壓棧順序。

二、參數壓棧順序

C/C++中規定了函數參數的壓棧順序是從右至左,對于含有不定參數的printf函數,其原型是printf(const char* format,…);其中format確定了printf的參數(通過format的%個數判斷)。假設是從左至右壓棧,那么先入棧的是format(這里我們簡化理解為參數個數),然后依次入棧未知參數,此時想要知道參數個數,就必須找到format,而要找到format,就必須知道參數個數,陷入一個邏輯矛盾。因此C/C++中規定參數壓棧為從右至左,這樣對于不定參數,最后入棧的是參數個數,只需要取棧頂就可以得到??梢酝ㄟ^下面的程序驗證:

#include <stdio.h>
void foo(int x, int y, int z)
{
    printf("x = %d at [%X]\n", x, &x);
    printf("y = %d at [%X]\n", y, &y);
    printf("z = %d at [%X]\n", z, &z);
}
int main(int argc, char *argv[])
{
    foo(100, 200, 300);
    return 0;
}

用代碼實例解析C/C++多參數函數參數的計算順序與壓棧順序

通過輸出結果可以看到x,y,z的棧內地址依次是 x < y < z;而棧的生長方向是從高到低,也就是先入棧的占高地址,因此z先入棧,其次是y,最后是x,即壓棧順序從右至左。

三、參數計算順序

知道參數壓棧順序從右至左,是不是可以得出結論strings.push_back( s.substr(++current, last-current)); 先執行last-current,再執行++current呢?其實不然,先執行哪個參數和參數的計算順序有關,而 C/C++中沒有規定函數參數的計算順序,即計算順序依照編譯器 ,編譯器規定從右至左計算就先執行last-current,規定從左至右就先執行++current,筆者試過codeblocks與vscode的計算順序都是從右至左。

也正因為函數參數的計算順序依照編譯器的實現,因此,C/C++的代碼編寫中并不支持編寫諸如 func(++x, x+y)這種的程序,在不同編譯器下可能產生不同的結果,所以上述代碼應該分開寫為:

 int len = last - current;
    ++current;
    strings.push_back(
      s.substr(current, len));

以上就是關于用代碼實例解析C/C++多參數函數參數的計算順序與壓棧順序的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女