最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++多參數(shù)函數(shù)參數(shù)的計算順序與壓棧順序的示例代碼

 更新時間:2020年06月01日 09:30:02   作者:_程序兔  
這篇文章主要介紹了C/C++多參數(shù)函數(shù)參數(shù)的計算順序與壓棧順序,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、前言

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

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

經(jīng)過查閱資料,發(fā)現(xiàn)了兩個相關(guān)知識點----參數(shù)的計算順序與壓棧順序。

二、參數(shù)壓棧順序

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

#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;
}

 

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

三、參數(shù)計算順序

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

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

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

總結(jié)

到此這篇關(guān)于C/C++多參數(shù)函數(shù)參數(shù)的計算順序與壓棧順序的示例代碼的文章就介紹到這了,更多相關(guān)c/c++函數(shù)參數(shù)壓棧順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt實現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件

    Qt實現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件

    在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹SqlRelationalTable關(guān)聯(lián)表組件的常用方法及靈活運用,感興趣的可以了解一下
    2023-12-12
  • C++基礎(chǔ)入門教程(五):new和delete

    C++基礎(chǔ)入門教程(五):new和delete

    這篇文章主要介紹了C++基礎(chǔ)入門教程(五):new和delete,本文講解了動態(tài)分配內(nèi)存、new和delete的配對、new、delete與reatin、release的關(guān)系、動態(tài)數(shù)組等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Qt實現(xiàn)簡易毛玻璃效果的示例代碼

    Qt實現(xiàn)簡易毛玻璃效果的示例代碼

    這篇文章主要介紹了Qt如何利用模糊功能實現(xiàn)簡易的毛玻璃效果,并且鼠標(biāo)可以移動無邊框窗口,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • VC++6.0中創(chuàng)建C++項目的實現(xiàn)步驟

    VC++6.0中創(chuàng)建C++項目的實現(xiàn)步驟

    本文主要介紹了VC++6.0中創(chuàng)建C++項目的實現(xiàn)步驟,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • C++ 將文件數(shù)據(jù)一次性加載進內(nèi)存實例代碼

    C++ 將文件數(shù)據(jù)一次性加載進內(nèi)存實例代碼

    這篇文章主要介紹了C++ 將文件數(shù)據(jù)一次性加載進內(nèi)存實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++語言 STL容器list總結(jié)

    C++語言 STL容器list總結(jié)

    這篇文章主要介紹了C++語言 STL容器list總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • kernel利用pt?regs劫持seq?operations的遷移過程詳解

    kernel利用pt?regs劫持seq?operations的遷移過程詳解

    這篇文章主要為大家介紹了kernel利用pt_regs劫持seq_operations進行遷移的過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 基于C語言實現(xiàn)簡易的掃雷游戲

    基于C語言實現(xiàn)簡易的掃雷游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)簡易的掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)小型復(fù)數(shù)計算器

    C++實現(xiàn)小型復(fù)數(shù)計算器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)小型復(fù)數(shù)計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ template用法案例詳解

    C++ template用法案例詳解

    這篇文章主要介紹了C++ template用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

四子王旗| 河南省| 日喀则市| 农安县| 汉沽区| 永州市| 栾川县| 江川县| 呼图壁县| 莫力| 台南县| 吴江市| 葵青区| 晴隆县| 于都县| 云和县| 蒲江县| 乌拉特前旗| 监利县| 沾益县| 宁国市| 宝丰县| 商水县| 眉山市| 大宁县| 尉氏县| 鹤山市| 重庆市| 永昌县| 秦安县| 陇西县| 梅州市| 兰考县| 新昌县| 红桥区| 武威市| 太康县| 梧州市| 阿拉善盟| 连云港市| 吕梁市|