您好,登錄后才能下訂單哦!
這篇文章主要用代碼實(shí)例解析C/C++多參數(shù)函數(shù)參數(shù)的計(jì)算順序與壓棧順序,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
一、前言
今天在看Thinking in C++這本書(shū)時(shí),書(shū)中的一個(gè)例子引起了我的注意,具體是使用了下面這句
單看這條語(yǔ)句的語(yǔ)義會(huì)發(fā)現(xiàn)僅僅是使用一個(gè)簡(jiǎn)單的string的substr函數(shù)將所得子串push_back到strings。但是在閱讀時(shí)我卻對(duì)于substr的參數(shù)傳遞產(chǎn)生了疑惑,到底是先執(zhí)行了++current,還是先執(zhí)行了last-current?
經(jīng)過(guò)查閱資料,發(fā)現(xiàn)了兩個(gè)相關(guān)知識(shí)點(diǎn)----參數(shù)的計(jì)算順序與壓棧順序。
二、參數(shù)壓棧順序
C/C++中規(guī)定了函數(shù)參數(shù)的壓棧順序是從右至左,對(duì)于含有不定參數(shù)的printf函數(shù),其原型是printf(const char* format,…);其中format確定了printf的參數(shù)(通過(guò)format的%個(gè)數(shù)判斷)。假設(shè)是從左至右壓棧,那么先入棧的是format(這里我們簡(jiǎn)化理解為參數(shù)個(gè)數(shù)),然后依次入棧未知參數(shù),此時(shí)想要知道參數(shù)個(gè)數(shù),就必須找到format,而要找到format,就必須知道參數(shù)個(gè)數(shù),陷入一個(gè)邏輯矛盾。因此C/C++中規(guī)定參數(shù)壓棧為從右至左,這樣對(duì)于不定參數(shù),最后入棧的是參數(shù)個(gè)數(shù),只需要取棧頂就可以得到??梢酝ㄟ^(guò)下面的程序驗(yàn)證:
#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; }
通過(guò)輸出結(jié)果可以看到x,y,z的棧內(nèi)地址依次是 x < y < z;而棧的生長(zhǎng)方向是從高到低,也就是先入棧的占高地址,因此z先入棧,其次是y,最后是x,即壓棧順序從右至左。
三、參數(shù)計(jì)算順序
知道參數(shù)壓棧順序從右至左,是不是可以得出結(jié)論strings.push_back( s.substr(++current, last-current)); 先執(zhí)行l(wèi)ast-current,再執(zhí)行++current呢?其實(shí)不然,先執(zhí)行哪個(gè)參數(shù)和參數(shù)的計(jì)算順序有關(guān),而 C/C++中沒(méi)有規(guī)定函數(shù)參數(shù)的計(jì)算順序,即計(jì)算順序依照編譯器 ,編譯器規(guī)定從右至左計(jì)算就先執(zhí)行l(wèi)ast-current,規(guī)定從左至右就先執(zhí)行++current,筆者試過(guò)codeblocks與vscode的計(jì)算順序都是從右至左。
也正因?yàn)楹瘮?shù)參數(shù)的計(jì)算順序依照編譯器的實(shí)現(xiàn),因此,C/C++的代碼編寫(xiě)中并不支持編寫(xiě)諸如 func(++x, x+y)這種的程序,在不同編譯器下可能產(chǎn)生不同的結(jié)果,所以上述代碼應(yīng)該分開(kāi)寫(xiě)為:
int len = last - current; ++current; strings.push_back( s.substr(current, len));
以上就是關(guān)于用代碼實(shí)例解析C/C++多參數(shù)函數(shù)參數(shù)的計(jì)算順序與壓棧順序的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。