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

C語言舉例講解i++與++i之間的區(qū)別

 更新時(shí)間:2022年05月11日 14:08:37   作者:GG_Bond18  
這篇文章主要介紹了C語言中i++和++i的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.++i和i++的區(qū)別

眾所周知的(也是學(xué)校教的),就是先自增再賦值還是先賦值再自增的區(qū)別。

#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	int b = 0;
	int c = ++a;
	int d = b++;
	cout << "c = " << c << endl;
	cout << "d = " << d << endl;
	return 0;
}

  • a先自增再賦值給c,所以輸出c為1。
  • b先賦值給d再自增,所以輸出d為0。

從這個(gè)方面來看,++i與i++的區(qū)別(尤其是性能方面)沒有什么差別,很多同學(xué)也并沒有思考過這個(gè)問題。

2.++i與i++哪個(gè)效率更高

下面是兩段源碼及其通過vs反匯編得到的匯編代碼:

使用++i

#include<iostream>
using namespace std;
int main()
{
	for (int i = 0; i < 100; ++i)
	{
		cout << "hello world" << endl;
	}
	return 0;
}

#include<iostream>
using namespace std;
int main()
{
00552540  push        ebp
00552541  mov         ebp,esp
00552543  sub         esp,0CCh
00552549  push        ebx
0055254A  push        esi
0055254B  push        edi
0055254C  lea         edi,[ebp-0Ch]
0055254F  mov         ecx,3
00552554  mov         eax,0CCCCCCCCh
00552559  rep stos    dword ptr es:[edi]
0055255B  mov         ecx,offset _57B8321F_源@cpp (055F029h)
00552560  call        @__CheckForDebuggerJustMyCode@4 (055137Fh)
    for (int i = 0; i < 100; ++i)
00552565  mov         dword ptr [ebp-8],0
0055256C  jmp         __$EncStackInitStart+2Bh (0552577h)
0055256E  mov         eax,dword ptr [ebp-8]
00552571  add         eax,1
00552574  mov         dword ptr [ebp-8],eax
00552577  cmp         dword ptr [ebp-8],64h
0055257B  jge         __$EncStackInitStart+5Ch (05525A8h)
    {
        cout << "hello world" << endl;
0055257D  mov         esi,esp
0055257F  push        offset std::endl<char,std::char_traits<char> > (055103Ch)
00552584  push        offset string "hello world" (0559B30h)
00552589  mov         eax,dword ptr [__imp_std::cout (055D0D4h)]
0055258E  push        eax
0055258F  call        std::operator<<<std::char_traits<char> > (05511A9h)
00552594  add         esp,8
00552597  mov         ecx,eax
00552599  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (055D0A0h)]
0055259F  cmp         esi,esp
005525A1  call        __RTC_CheckEsp (055128Fh)
    }
005525A6  jmp         __$EncStackInitStart+22h (055256Eh)
    return 0;
005525A8  xor         eax,eax
}

使用i++

#include<iostream>
using namespace std;
int main()
{
	for (int i = 0; i < 100; i++)
	{
		cout << "hello world" << endl;
	}
	return 0;
}

 #include<iostream>
using namespace std;
int main()
{
008B2540  push        ebp
008B2541  mov         ebp,esp
008B2543  sub         esp,0CCh
008B2549  push        ebx
008B254A  push        esi
008B254B  push        edi
008B254C  lea         edi,[ebp-0Ch]
008B254F  mov         ecx,3
008B2554  mov         eax,0CCCCCCCCh
008B2559  rep stos    dword ptr es:[edi]
008B255B  mov         ecx,offset _57B8321F_源@cpp (08BF029h)
008B2560  call        @__CheckForDebuggerJustMyCode@4 (08B137Fh)
    for (int i = 0; i < 100; i++)
008B2565  mov         dword ptr [ebp-8],0
008B256C  jmp         __$EncStackInitStart+2Bh (08B2577h)
008B256E  mov         eax,dword ptr [ebp-8]
008B2571  add         eax,1
008B2574  mov         dword ptr [ebp-8],eax
008B2577  cmp         dword ptr [ebp-8],64h
008B257B  jge         __$EncStackInitStart+5Ch (08B25A8h)
    {
        cout << "hello world" << endl;
008B257D  mov         esi,esp
008B257F  push        offset std::endl<char,std::char_traits<char> > (08B103Ch)
008B2584  push        offset string "hello world" (08B9B30h)
008B2589  mov         eax,dword ptr [__imp_std::cout (08BD0D4h)]
008B258E  push        eax
008B258F  call        std::operator<<<std::char_traits<char> > (08B11A9h)
008B2594  add         esp,8
008B2597  mov         ecx,eax
008B2599  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (08BD0A0h)]
008B259F  cmp         esi,esp
008B25A1  call        __RTC_CheckEsp (08B128Fh)
    }
008B25A6  jmp         __$EncStackInitStart+22h (08B256Eh)
    return 0;
008B25A8  xor         eax,eax
}

哈哈哈哈哈,有的同學(xué)已經(jīng)發(fā)現(xiàn)了,好像并沒有什么區(qū)別。

之前的說法是++i比i++的效率更高,但隨著編譯器的不斷優(yōu)化,兩者簡單應(yīng)用時(shí)并沒有什么區(qū)別。

但是,真是如此嗎?

i++使用時(shí),要先用將自身數(shù)據(jù)拷貝到臨時(shí)變量中,再自增,最后傳輸臨時(shí)變量。

而++i并不需要這般麻煩,直接自增再傳輸即可。一些追求壓縮空間和時(shí)間的嵌入式工程師往往喜歡使用++i。

下面通過運(yùn)算符重載自實(shí)現(xiàn)++i和i++來解釋:

#include<iostream>
using namespace std;
class MyInt
{
	friend ostream& operator<<(ostream& cout, MyInt& a);//友元
public:
	MyInt();
	MyInt& operator++();//前置++
	MyInt& operator++(int);//使用占位參數(shù)區(qū)別前后置++,使之可以發(fā)生函數(shù)重載
private:
	int m_num;
};
MyInt::MyInt()
{
	this->m_num = 0;
}
MyInt& MyInt::operator++()
{
	this->m_num++;
	return *this;
}
MyInt& MyInt::operator++(int)
{
	static MyInt temp = *this;
	this->m_num++;
	return temp;
}
ostream& operator<<(ostream& cout, MyInt& a)
{
	cout << a.m_num;
	return cout;
}

通過上面的代碼顯而易見其區(qū)別,且后置++難以實(shí)現(xiàn)鏈?zhǔn)骄幊獭?/p>

3.總結(jié)

普通簡單使用的情況下,兩者并沒有什么區(qū)別。

但在某些機(jī)器情況下或在類中使用時(shí),++i的效率更高。

初學(xué)小白可以養(yǎng)成使用++i而非i++的習(xí)慣哦!

到此這篇關(guān)于C語言舉例講解i++與++i之間的區(qū)別的文章就介紹到這了,更多相關(guān)C語言 i++與++i內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中正切的相關(guān)函數(shù)總結(jié)

    C語言中正切的相關(guān)函數(shù)總結(jié)

    這篇文章主要介紹了C語言中正切的相關(guān)函數(shù)總結(jié),包括正切和反正切以及雙曲線正切等的函數(shù),需要的朋友可以參考下
    2015-08-08
  • 詳解如何將Spire.PDF for C++集成到C++程序中

    詳解如何將Spire.PDF for C++集成到C++程序中

    Spire.PDF for C++ 是一個(gè)專業(yè)的 PDF 庫,供開發(fā)人員在任何類型的 C++ 應(yīng)用程序中閱讀、創(chuàng)建、編輯和轉(zhuǎn)換 PDF 文檔,本文主要介紹了兩種不同的方式將 Spire.PDF for C++ 集成到您的 C++ 應(yīng)用程序中,希望對(duì)大家有所幫助
    2023-11-11
  • C語言之循環(huán)語句詳細(xì)介紹

    C語言之循環(huán)語句詳細(xì)介紹

    大家好,本篇文章主要講的是C語言之循環(huán)語句詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 在 VSCode 中配置 C++ 開發(fā)環(huán)境的詳細(xì)教程

    在 VSCode 中配置 C++ 開發(fā)環(huán)境的詳細(xì)教程

    本文詳細(xì)介紹了如何在Visual Studio Code(VSCode)中配置C++開發(fā)環(huán)境,包括安裝必要的工具、配置編譯器、設(shè)置調(diào)試環(huán)境等步驟,通過這些步驟,你可以快速搭建C++開發(fā)環(huán)境,實(shí)現(xiàn)高效編程,感興趣的朋友一起看看吧
    2025-01-01
  • dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟

    dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟

    本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C++訪問者模式模板函數(shù)無法重載的問題解決

    C++訪問者模式模板函數(shù)無法重載的問題解決

    本文主要介紹了C++訪問者模式模板函數(shù)無法重載的問題解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤

    C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤

    這篇文章主要為大家詳細(xì)介紹了C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解C語言學(xué)習(xí)記錄之指針

    詳解C語言學(xué)習(xí)記錄之指針

    關(guān)于指針,其是C語言的重點(diǎn),C語言學(xué)的好壞,其實(shí)就是指針學(xué)的好壞。其實(shí)指針并不復(fù)雜,學(xué)習(xí)指針,要正確的理解指針,本片文章能給就來學(xué)習(xí)一下
    2021-11-11
  • 淺談C語言編程中的布爾bool數(shù)據(jù)類型

    淺談C語言編程中的布爾bool數(shù)據(jù)類型

    這篇文章主要介紹了C語言編程中的布爾bool數(shù)據(jù)類型,bool并不是需要通過C++才能使用的,需要的朋友可以參考下
    2015-11-11
  • 詳解C++編譯器優(yōu)化技術(shù)

    詳解C++編譯器優(yōu)化技術(shù)

    現(xiàn)代編譯器缺省會(huì)使用RVO(return value optimization,返回值優(yōu)化)、NRVO(named return value optimization、命名返回值優(yōu)化)和復(fù)制省略(Copy elision)技術(shù),來減少拷貝次數(shù)來提升代碼的運(yùn)行效率。
    2021-06-06

最新評(píng)論

中方县| 库尔勒市| 达州市| 调兵山市| 冀州市| 汉寿县| 慈溪市| 内丘县| 岳阳市| 遂川县| 巴马| 普定县| 济源市| 和顺县| 儋州市| 庆城县| 双辽市| 芜湖市| 平果县| 晋州市| 高邑县| 循化| 开化县| 义马市| 东辽县| 乌兰察布市| 丹巴县| 渝北区| 韶关市| 齐齐哈尔市| 五常市| 巨鹿县| 布尔津县| 恩平市| 睢宁县| 平乐县| 邓州市| 阿荣旗| 通许县| 竹山县| 两当县|