国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案

這篇具有很好參考價(jià)值的文章主要介紹了C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

C++ 是一門強(qiáng)大而復(fù)雜的編程語言,它有其獨(dú)特的應(yīng)用場(chǎng)景和優(yōu)勢(shì),盡管它可能在學(xué)習(xí)和使用上有一些挑戰(zhàn),但仍然被廣泛采用的原因有很多,盡管 C++ 有其優(yōu)勢(shì),但它也確實(shí)有一些復(fù)雜性和潛在的陷阱,因此在選擇使用它時(shí)需要權(quán)衡。對(duì)于一些應(yīng)用場(chǎng)景,其他編程語言,如Python、Java 或C#,可能更容易上手并且更適合。選擇使用 C++ 還取決于你的具體項(xiàng)目需求、團(tuán)隊(duì)技能和資源可用性。

轉(zhuǎn)眼間已經(jīng)畢業(yè)幾年了,在大學(xué)里一直使用的是Java做的很多項(xiàng)目,參加很多比賽做的項(xiàng)目也是Java+Spring Boot做的后端,談到這里就想到了很多很多回憶.什么IOC,什么Docker,什么Mybtis源碼當(dāng)時(shí)真的賊熟.

在大學(xué)里還做了一個(gè)開源項(xiàng)目:https://github.com/truedei/truedei-swagger-plugin

甚至大四實(shí)習(xí)時(shí)也是使用的Java做后端開發(fā)

為什么我畢業(yè)后卻找了C語言和C++相關(guān)的工作呢?請(qǐng)跟隨腳步,繼續(xù)往下看.

文字有點(diǎn)多,耐心一些,文末送幾本書大家可以看下.

為什么入門選C,不選C++/Java/Python?

踏入大學(xué)的后,計(jì)算機(jī)相關(guān)專業(yè)同學(xué)大多入門的編程課都是C語言,然后慢慢進(jìn)階到C++/Java/Python等高級(jí)語言.為什么會(huì)先學(xué)C,為什么不直接學(xué)習(xí)Java或者C++呢?聽到的很多回答的聲音都是一致認(rèn)為:

  1. 簡(jiǎn)單性和基礎(chǔ)性:C 語言相對(duì)于許多高級(jí)編程語言來說更加簡(jiǎn)單,語法相對(duì)較少,更容易理解和學(xué)習(xí)。這使得它成為理想的入門語言,有助于建立基本的編程概念和技能,如控制流、數(shù)據(jù)結(jié)構(gòu)、函數(shù)等。

  2. 底層控制:C 語言提供了對(duì)計(jì)算機(jī)硬件的較低級(jí)別控制,這對(duì)于理解計(jì)算機(jī)體系結(jié)構(gòu)和系統(tǒng)編程非常有幫助。大學(xué)通常希望學(xué)生在深入學(xué)習(xí)更高級(jí)語言之前,能夠建立這種底層理解。

  3. 跨平臺(tái)性:C 語言是一種較為底層的語言,能夠在各種操作系統(tǒng)和硬件平臺(tái)上編寫程序,這有助于培養(yǎng)學(xué)生編寫可移植代碼的能力。

  4. 基本算法和數(shù)據(jù)結(jié)構(gòu):學(xué)習(xí) C 語言有助于學(xué)生更深入地理解基本的算法和數(shù)據(jù)結(jié)構(gòu),這些知識(shí)在后續(xù)的編程中非常重要,無論是使用 C++、Java 還是 Python。

    一旦學(xué)生掌握了 C 語言的基礎(chǔ)編程概念,他們通常會(huì)更容易地過渡到其他編程語言,因?yàn)樵S多高級(jí)語言如 C++ 和 Java 基于 C 語言,具有類似的語法結(jié)構(gòu)和編程概念。此外,學(xué)習(xí) C 語言可以為學(xué)生提供堅(jiān)實(shí)的編程基礎(chǔ),使他們更容易理解高級(jí)語言中的抽象概念和面向?qū)ο缶幊獭?br> 雖然學(xué)習(xí) C 語言可能需要更多的時(shí)間和精力,但它為學(xué)生提供了深入理解計(jì)算機(jī)編程的堅(jiān)實(shí)基礎(chǔ),這對(duì)于他們未來的職業(yè)發(fā)展非常有幫助。一旦他們掌握了 C 語言,學(xué)習(xí)其他編程語言通常會(huì)相對(duì)容易。因此,大多數(shù)大學(xué)選擇以 C 語言作為計(jì)算機(jī)科學(xué)專業(yè)的入門編程語言是有一定合理性的。

誰在用C++?

C++ 是一門廣泛應(yīng)用的編程語言,許多組織和領(lǐng)域都在使用它。小到嵌入式,大到各種服務(wù)器,到處都可以見到C++的身影. 以下是一些主要領(lǐng)域和用途:

  1. 游戲開發(fā):C++ 在游戲開發(fā)中非常流行。許多大型游戲引擎,如Unity、Unreal Engine 和 CryEngine,都使用 C++ 編寫。這是因?yàn)?C++ 提供了高性能和直接的硬件控制,對(duì)于需要實(shí)時(shí)圖形渲染和物理模擬的游戲非常重要。
  2. 系統(tǒng)編程:操作系統(tǒng)、驅(qū)動(dòng)程序和嵌入式系統(tǒng)通常使用 C++ 編寫。C++ 具有底層硬件控制和內(nèi)存管理的能力,使其成為這些領(lǐng)域的首選語言。
  3. 金融領(lǐng)域:許多金融機(jī)構(gòu)使用 C++ 來構(gòu)建高性能的交易系統(tǒng)和金融應(yīng)用程序。這是因?yàn)?C++ 能夠快速執(zhí)行復(fù)雜的算法和處理大量的數(shù)據(jù)。
  4. 科學(xué)計(jì)算和數(shù)據(jù)分析:C++ 用于高性能科學(xué)計(jì)算和數(shù)據(jù)分析任務(wù),特別是當(dāng)需要進(jìn)行數(shù)值計(jì)算或處理大型數(shù)據(jù)集時(shí)。例如,一些數(shù)值庫和數(shù)據(jù)處理庫使用 C++ 編寫。
  5. 嵌入式系統(tǒng):C++ 在嵌入式系統(tǒng)領(lǐng)域非常有用,因?yàn)樗梢葬槍?duì)特定硬件平臺(tái)進(jìn)行優(yōu)化,并提供了對(duì)硬件的低級(jí)別訪問。
  6. 網(wǎng)絡(luò)和通信:一些網(wǎng)絡(luò)和通信應(yīng)用程序使用 C++ 編寫,以實(shí)現(xiàn)高性能的數(shù)據(jù)傳輸和協(xié)議處理。
  7. 圖形設(shè)計(jì)和計(jì)算機(jī)圖形學(xué):C++ 用于創(chuàng)建圖形設(shè)計(jì)工具、3D建模軟件以及圖形渲染應(yīng)用程序。一些開源圖形庫,如OpenGL和DirectX,也是用C++編寫的。
  8. 大規(guī)模應(yīng)用程序:一些大規(guī)模的應(yīng)用程序,如數(shù)據(jù)庫管理系統(tǒng)和操作系統(tǒng)核心,也使用C++編寫,因?yàn)樗峁┝烁叨鹊目煽匦院托阅堋?/li>

C++ 是一門多用途的編程語言,由于其性能、控制力和跨平臺(tái)能力,被廣泛應(yīng)用于各種不同的領(lǐng)域和行業(yè)。雖然它有一些復(fù)雜性,但在需要高性能和底層控制的應(yīng)用中,仍然是一個(gè)強(qiáng)大的選擇。

我的經(jīng)歷

為什么我畢業(yè)后卻找了C語言和C++相關(guān)的工作呢?現(xiàn)在就揭曉答案.

原因是:就在即將畢業(yè)的前夕,還有2-3周就要離校了. 其實(shí)我已經(jīng)找好工作了,北京,上海,深圳都拿到了面試的Offer.深圳拿到了20多K也是很不錯(cuò)的,年薪30W+,公司挺不錯(cuò)的,也很大但是沒去,有點(diǎn)不喜歡這家公司的文化,加班比較嚴(yán)重,離家也非常遠(yuǎn),萬一家里有點(diǎn)啥事回趟家都費(fèi)勁.從深圳回個(gè)家就小1000沒了,來回2000沒了…想想就不能接受.

北京也很不錯(cuò),Offer有游戲開發(fā)的崗位,也有傳統(tǒng)軟件的崗位等,北京真的不太想去了,因?yàn)榇笏脑诒本V聯(lián)達(dá)總部實(shí)習(xí)了一年,北京給我的感覺就是堵,走到哪都是排隊(duì),排隊(duì),再排隊(duì).

各種原因就選擇了上海,就在選擇了上海的Offer之后.突然招聘軟件有位好老板聯(lián)系到了我,問我想不想試試他們的這個(gè)崗位. 當(dāng)時(shí)我已經(jīng)跟上海的另一家公司談好了,公司也有幾百人.我就各種推辭,不太想嘗試,有一點(diǎn)是因?yàn)楣颈容^小,覺得可能也沒這么可靠吧.而且我之前面試都是Java,這家公司需要C或C++知識(shí)體系的人.而且是屬于Linux下的C/C++軟件開發(fā)…

我對(duì)Linux情有獨(dú)鐘,因?yàn)槲覐母咭痪徒佑|到了Linux,高中還參加Linux比賽,拿到了全國的金牌獎(jiǎng)項(xiàng),一直到大學(xué)一直在無間斷的使用Linux.

其實(shí)沒看到這家公司招聘之前,我一直不想去找Linux相關(guān)的工作,第一是因?yàn)楦杏X運(yùn)維太簡(jiǎn)單了,不想接觸.第二是難的崗位太難了,而且自己從來沒接觸過.

后來經(jīng)過交談, 這家公司真的給我眼前一亮,好老板說我沒接觸過這個(gè)相關(guān)的也沒關(guān)系,也原因給我時(shí)間工作后去學(xué)習(xí),而且薪資也可以按照已經(jīng)找到的工作的薪資付給我.(有點(diǎn)心動(dòng)了)就答應(yīng)了可以參加面試.

后來公司的技術(shù)負(fù)責(zé)人和好老板一塊參與了交談和面試, 經(jīng)過交談,給我的感覺是這個(gè)技術(shù)負(fù)責(zé)人和我大四實(shí)習(xí)是的師傅一樣,人還不錯(cuò),實(shí)習(xí)時(shí)找的工作就是因?yàn)槊嬖嚨母杏X比較好,交談的比較舒服才決定去這家公司的.而且你不理解的東西,能給你講的透透的…這妥妥的是一位大佬,有大佬帶誰不心動(dòng)…最后答應(yīng)就去了這家公司.

就這樣,從Java轉(zhuǎn)到C/C++就靠了一個(gè)緣分.真的很感謝好老板給的機(jī)會(huì).我是真的喜歡Linux.就想挑戰(zhàn)有難度的工作.

就這樣,到了現(xiàn)在,一直在做Linux嵌入式應(yīng)用程序,音視頻相關(guān)的工作,也接觸一些Linux內(nèi)核,驅(qū)動(dòng)相關(guān)的工作.都是C/C++.

C++是真難,用到了快放棄.

我認(rèn)為難點(diǎn)在于(站在嵌入式的領(lǐng)域來說):

  • 1.調(diào)試麻煩,做嵌入式的工作,我認(rèn)為唯一有效率且通用的調(diào)試方式就是printf();(那么想快速的調(diào)試代碼,找到BUG,就需要學(xué)習(xí)GDB等調(diào)試工具了)
  • 2.開發(fā)工具都不是這么智能,你使用的開發(fā)工具可能永遠(yuǎn)提示不出來xxx.xxx.后面的代碼補(bǔ)全提示,不像在開發(fā)Java的時(shí)候有IDEA神器;(那么想使用好C/C++就需要看個(gè)人基礎(chǔ)了)
  • 3.如果沒有硬件的知識(shí),一旦和硬件的技術(shù)打交道就會(huì)比較吃力.(無其他辦法,除了學(xué)習(xí)還是得繼續(xù)學(xué)習(xí))
  • 4.需要比較強(qiáng)的理論知識(shí);
  • 5.編程語言的規(guī)范.(非常重要,非常重要,非常重要,非常重要)

基礎(chǔ)問題,大有學(xué)問

下面是我之前記錄的一些問題,學(xué)習(xí)記錄而來,還未來得及發(fā)博客.正好可以體現(xiàn)出來C++規(guī)范.將從以下幾個(gè)方面來闡述在C與語言開發(fā)中所遇到的問題,以及如何使用C++來解決,以及相應(yīng)的解決方案;

1、C語言字符語法的常見陷阱及如何用C++來解決

例如,定義了如下4個(gè)變量

char c1 = 'yes';
char c2 = "yes";

const char* s1 = "/";
const char* s2 = '/';

可以以你的經(jīng)驗(yàn)來選擇哪個(gè)對(duì),哪個(gè)錯(cuò);

答案是:

c1和s1對(duì),c2和s2錯(cuò);

這里需要注意的是char和char*,雙" "引號(hào)和單’ '號(hào)的區(qū)別:

char存放單個(gè)字符;
char*存放一串字符;

雙引號(hào)" "存放一個(gè)字符串;
但引號(hào)’ '存放一個(gè)字符;

所以:

我們用char來存放一個(gè)字符串是錯(cuò)的

char c2 = "yes";

所以:

用char*存放一個(gè)字符是錯(cuò)的

const char* s2 = '/';

你是不是在想:把c2=“yes”,改成c2=“y”,雙引號(hào)""中只存放單個(gè)字符是不是就可以了呢?

char c2 = "yes";

#改成

char c2 = "y";

答案是不可以的;

例如:

char c2 = "y"; // “y” 雙引號(hào)其實(shí)是由\0結(jié)尾的,所以真正的存儲(chǔ)方式是: {'y','\0'}

有些同志可能對(duì)c1有點(diǎn)疑惑,單引號(hào)’'不是來存儲(chǔ)單個(gè)字符的嗎?為什么c1=‘yes’,寫了3個(gè)字符也沒問題呢?
這是因?yàn)镃語言編譯器有截?cái)鄼C(jī)制;

char c1 = 'yes';//會(huì)被截?cái)?,結(jié)果可能有2種:1.保留首字符,2.保留尾字符
cout << c1 << endl; 

如果把c1打印出來,我電腦中的結(jié)果是s;

不同的編譯器可能結(jié)果是不同的。

ubuntu x86的電腦上:

(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ g++ main.cpp 
main.cpp:15:15: warning: multi-character character constant [-Wmultichar]
   15 |     char c1 = 'yes';
      |               ^~~~~
main.cpp: In function ‘int main()’:
main.cpp:15:15: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘7955827’ to ‘'s'[-Woverflow]
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ 

arm交叉編譯工具:

(base) zhenghui@zh-pc:~/tftpboot$ arm-linux-gnueabihf-sigmastar-9.1.0-g++ test.cpp -o test
test.cpp:5:15: 警告: 多字節(jié)字符常量 [-Wmultichar]
    5 |     char c1 = 'yes';
      |               ^~~~~
test.cpp: 在函數(shù)‘int main()’中:
test.cpp:5:15: 警告: unsigned conversion from ‘int’ to ‘char’ changes value from ‘7955827’ to ‘'s'[-Woverflow]
(base) zhenghui@zh-pc:~/tftpboot$ 

可以看到提示的警告信息,會(huì)自動(dòng)轉(zhuǎn)換成s;

又換了一種arm交叉編譯工具:

(base) zhenghui@zh-pc:~/tftpboot$ arm-linux-gnueabihf-g++ test.cpp -o test
test.cpp:5:15: 警告: 多字節(jié)字符常量 [-Wmultichar]
     char c1 = 'yes';
               ^~~~~
test.cpp: 在函數(shù)‘int main()’中:
test.cpp:5:15: 警告: large integer implicitly truncated to unsigned type [-Woverflow]
(base) zhenghui@zh-pc:~/tftpboot$ 

依然會(huì)被截?cái)啵Y(jié)果還是s;

又換了一個(gè),結(jié)果還是一樣:

zh@xxx:project$ arm-none-linux-gnueabi-g++ test.cpp -o testa
test.cpp:5:15: warning: multi-character character constant
test.cpp: In function 'int main()':
test.cpp:5: warning: large integer implicitly truncated to unsigned type
zh@xxx:project$ 

對(duì)于s1和s2也是:因?yàn)閏har*接收的是一個(gè)字符串,但是s2傳遞的是一個(gè)單引號(hào)’'的值,所以s2會(huì)報(bào)錯(cuò)。

const char* s1 = "/";
const char* s2 = '/';

但是char*可以引用char:

    char c1 = 'yes'; //s
//    char c2 = "yes";
    cout << c1 << endl;

    const char* s1 = "/";
//    const char* s2 = '/';
    const char* s2 = &c1;  //s
    cout << *s2 << endl;

C語言是高級(jí)語言中的低級(jí)語言。

優(yōu)點(diǎn)是:小巧,高效,接近地層;
缺點(diǎn)是:細(xì)節(jié)和陷阱比較多。

使用C++來解決和規(guī)避以上問題

C++定義了string類,專門用來存儲(chǔ)和提供了一系列的字符串操作。

#include "string"
using namespace std;


string  str1(1,'yes');
cout << str1 << endl;           // s

string  str2(2,'yes');
cout << str2 << endl;           // ss

string  str3("yes");
cout << str3 << endl;           // yes

例如下面這個(gè),傳入了1,‘yes’,打印出來就取了1個(gè)s

string  str1(1,'yes');
cout << str1 << endl;           // s

傳遞2的時(shí)候,就打印了2個(gè)ss

string  str2(2,'yes');
cout << str2 << endl;           // ss

就可以規(guī)避上面的問題,用C++操作字符串也比較安心。

2、C語言數(shù)組常見問題及如何用C++來解決

我們?cè)贑語言項(xiàng)目開發(fā)中,經(jīng)常遇到函數(shù)之前傳遞數(shù)組的情況,也帶來了一些問題。

例如我們有如下一個(gè)數(shù)組:

int array1[] = {1,2,3,4,5,6,7,8,9,10};

我們求平均值:

double result;
for (int i = 0; i < 10; ++i) {
    result += array1[i];
}
result = result / 10;
cout << result << endl; //5.5

如果我們想再填入一些數(shù)呢?

int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};

估計(jì)自己數(shù)都數(shù)暈了吧。

在C語言中可以使用sizeof()函數(shù)計(jì)算一個(gè)數(shù)組的長(zhǎng)度。

例如我們可以改成這樣:

int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
int len = sizeof(array1) / sizeof(array1[0]);
double result;
for (int i = 0; i < len; ++i) {
    result += array1[i];
}
result = result / len;
cout << result << endl;

有了自動(dòng)計(jì)算數(shù)組中元素個(gè)數(shù)的代碼,我們就不用再手動(dòng)計(jì)算了。

但是我們把計(jì)算平均值的代碼提出為一個(gè)獨(dú)立函數(shù)時(shí)該怎么做呢?

可以寫一個(gè)函數(shù),把數(shù)組傳遞過去,然后返回平均值



double avg1(int array[]) {
    int len = sizeof(array) / sizeof(array[0]);
    double result;
    for (int i = 0; i < len; ++i) {
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {

    int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << avg1(array1) << endl;
    return 0;
}

運(yùn)行結(jié)果:

真是現(xiàn)實(shí)比較骨感阿。

1.5

算出來的值是不對(duì)的。

為什么造成這個(gè)結(jié)果呢?

我們?cè)?個(gè)函數(shù)中打印以下len的長(zhǎng)度看看:

double avg1(int array[]) {
    int len = sizeof(array) / sizeof(array[0]);
    cout << "avg1 len->" << len << endl; //2

    double result;
    for (int i = 0; i < len; ++i) {
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {

    int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << avg1(array1) << endl;
    return 0;
}

運(yùn)行結(jié)果:

main len->24
avg1 len->2
1.5

為什么傳遞過去的數(shù)組沒能計(jì)算出來結(jié)果呢?

因?yàn)椋?/p>

在C語言中傳遞數(shù)組時(shí),編譯器會(huì)把數(shù)組[]轉(zhuǎn)換成指針的方式傳遞過去;所以sizeof計(jì)算出來的結(jié)果并不是正確的。

編譯的時(shí)候,也會(huì)warning:

(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ g++ main.cpp 
main.cpp: In function ‘double avg1(int*)’:
main.cpp:8:22: warning: ‘sizeof’ on array function parameter ‘a(chǎn)rray’ will return size of ‘int*’ [-Wsizeof-array-argument]
    8 |     int len = sizeof(array) / sizeof(array[0]);
      |                     ~^~~~~~
main.cpp:7:17: note: declared here
    7 | double avg1(int array[]) {
      |             ~~~~^~~~~~~
(base) zhenghui@zh-pc:/data/project/CLionProjects/C_Project$ 

copy一份avg1改寫avg2:

這次改寫成指針的方式來接收一個(gè)數(shù)組,看看計(jì)算的結(jié)果是不是一樣

double avg2(int *array) {
    int len = sizeof(array) / sizeof(array[0]);
    cout << "avg2 len->" << len << endl; //2

    double result;
    for (int i = 0; i < len; ++i) {
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {

    int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << "avg1:"<<  avg1(array1) << endl;
    cout << "avg2:"<<  avg2(array1) << endl;
    return 0;
}

運(yùn)行結(jié)果:

avg2(int *array) 和 avg1(int array[]) 運(yùn)行的結(jié)果是一樣的,說明數(shù)組確實(shí)是被轉(zhuǎn)成指針了

main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5

值得一提的是,我們手動(dòng)g++編譯的時(shí)候,avg2并沒有報(bào)出warning信息,說明我們用指針的方式來接收一個(gè)數(shù)組的語法是正確的,編譯器是認(rèn)可的。

C語言中如何解決數(shù)組傳遞計(jì)算的值的多少不對(duì)的問題呢?

答案是在傳遞數(shù)組的時(shí)候把數(shù)組中的元素個(gè)數(shù)提前計(jì)算好,一起傳遞過去。

我們利用avg2改寫avg3:

double avg3(int *array, int len) {
    cout << "avg3 len->" << len << endl; //2
    double result;
    for (int i = 0; i < len; ++i) {
        result += array[i];
    }
    result = result / len;
    return result;
}

int main() {

    int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << "avg1:"<<  avg1(array1) << endl; //1.5
    cout << "avg2:"<<  avg2(array1) << endl; //1.5
    cout << "avg3:"<<  avg3(array1, len) << endl; //107.292
    return 0;
}

再次運(yùn)行結(jié)果:

可以看到正確了。

main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
avg3:avg3 len->24
107.292

用C++解決上述問題

在C++中提供了vector對(duì)象,需要include一下:

#include "vector"

copy avg3改寫avg4:

double avg4(vector<int> v) {
    cout << "avg4 len->" << v.size() << endl;
    double result;

    for (int i = 0; i < v.size(); ++i) {
        result += v[i];
    }
    result = result / v.size();
    return result;
}

vector數(shù)組的初始化如下:

int main() {

    int array1[] = {1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    int len = sizeof(array1) / sizeof(array1[0]);
    cout << "main len->" << len << endl; //24
    cout << "avg1:"<<  avg1(array1) << endl; //1.5
    cout << "avg2:"<<  avg2(array1) << endl; //1.5
    cout << "avg3:"<<  avg3(array1, len) << endl; //107.292

    vector<int> v{1,2,3,4,5,6,7,8,9,10,123,531,2,5,6,7,8,9,1233,54,123,64,257,98};
    cout << "avg4:"<<  avg4(v) << endl; //107.292

    return 0;
}

運(yùn)行結(jié)果:

main len->24
avg1:avg1 len->2
1.5
avg2:avg2 len->2
1.5
avg3:avg3 len->24
107.292
avg4:avg4 len->24
107.292

比較高效的傳遞方式是采用引用的方式傳遞過來:

這樣傳遞參數(shù)是比較高效的。

double avg4(vector<int> &v){
...
}

還可以改成迭代器的方式:

double avg5(vector<int> &v) {
    cout << "avg4 len->" << v.size() << endl;
    double result;

    vector<int>::iterator itr = v.begin();
    for (; itr != v.end(); ++itr) {
        result += (*itr);
    }
    result = result / v.size();
    return result;
}

使用vector寫二維數(shù)組:

double avg6(vector<vector<int>> &vv) {
    double result;

    int data_num = 0;
    for (int i = 0; i < vv.size(); ++i) {
        for (int j = 0; j < vv[i].size(); ++j) {
            result += vv[i][j];
            data_num++;
        }
    }

    result = result / data_num;
    return result;
}

int main() {
    vector<vector<int>> vv{{1,2,3},{1,2,3},{1,2,3}};
    cout << "avg6:"<<  avg6(vv) << endl; 
    return 0;
}

C++編程規(guī)范為什么這么重要?

提到C開發(fā)的一些規(guī)范, 有些C/C開發(fā)者可能想到了很多手冊(cè)什么的,就不一一列舉了,我比較喜歡的是 《C++ Core Guidelines 》這個(gè)開源項(xiàng)目

地址在: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

該開源項(xiàng)目是英文的,對(duì)國內(nèi)的開發(fā)者來說不是太友好.但是如果英語好,很值得一看.

自從得知國內(nèi)的C++大佬們,把國外的書籍翻譯過來了,《C++ Core Guidelines解析 》中文書籍已經(jīng)上市了,立馬買了看了看.

書中講解讓我受益匪淺,隨便放幾個(gè)照片:
C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案,C/C++,c++,java,開發(fā)語言

C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案,C/C++,c++,java,開發(fā)語言

書籍入口: 點(diǎn)我進(jìn)入書籍入口

點(diǎn)不進(jìn)去,再復(fù)制到瀏覽器也可以:
https://union-click.jd.com/jdc?e=&p=JF8BAPsJK1olXwQEU19VCk4WBF8IHloTVAcEXW4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYHVVhUCU0eHDZNRwYlD3NKUEQ0bxh0dD9LUC0RFlx8IV0ETkcbM2oIGlsUVQ4KUF1tC0oVAWgPG1kWVDYyVF9tWiXPtdnQvuoJiayNgdbKOEonA2gAGV8QWAQBUlhfDXsXC2s4Rh9JBVkBUm5tOEgnM18IK1glA2gDB1hfCRhAAgFVR1oQB1JUATBdAEMSBWwMGFwlXwcDVlxtOHtCUxNUUCZwBwZ9BB5UVAJveBtIQyx2NXtsVgYDdA5kSwtDGy9hCFZrMioNOA

巧了,我這有三本可以送給大家,大家可以先加我QQ群,然后加我微信,進(jìn)去微信點(diǎn)贊,送給微信點(diǎn)贊的第18名,68名和128名每人一本《C++ Core Guidelines解析 》中文書籍 .

個(gè)人微信就不方便放了,可以先加群.再加我私人微信.
C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案,C/C++,c++,java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-701900.html

到了這里,關(guān)于C++這么難,為什么我們還要用C++?C++ Core Guidelines解析給了我答案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 有了MySQL,為什么還要有NoSQL

    有了MySQL,為什么還要有NoSQL

    ? ? ??今日學(xué)習(xí)目標(biāo): ??MySQL和NoSQL的區(qū)別 ? 創(chuàng)作者 :林在閃閃發(fā)光 ?預(yù)計(jì)時(shí)間:30分鐘 ??個(gè)人主頁:林在閃閃發(fā)光的個(gè)人主頁 ???林在閃閃發(fā)光的個(gè)人社區(qū),歡迎你的加入:?林在閃閃發(fā)光的社區(qū) 目錄 noSQL的大概意思 理論支撐 為什么需要NoSQL 為什么NoSQL有處理超大規(guī)模

    2023年04月20日
    瀏覽(26)
  • CentOS軟件那么老為什么大家還要用它?

    作為一個(gè)專業(yè)的服務(wù)器系統(tǒng),RHEL 系統(tǒng)理論上每一個(gè)軟件包都有 RedHat 內(nèi)部的人員負(fù)責(zé)維護(hù),這個(gè)維護(hù)包括長(zhǎng)期(和系統(tǒng)生命周期一樣長(zhǎng))的開發(fā)、更新、測(cè)試、運(yùn)維等。也就是說你能從 RHEL 系統(tǒng)源上獲得的每一個(gè)軟件包,出現(xiàn)問題都可以找 RedHat 負(fù)責(zé)。所以 RHEL 不可能無限制

    2024年02月01日
    瀏覽(40)
  • 既然有Map了,為什么還要有Redis?

    既然有Map了,為什么還要有Redis?

    以下內(nèi)容轉(zhuǎn)自掘金 作者:哪吒編程 Redis可以存儲(chǔ)幾十個(gè)G的數(shù)據(jù),Map行嗎? Redis的緩存可以進(jìn)行本地持久化,Map行嗎? Redis可以作為分布式緩存,Map只能在同一個(gè)JVM中進(jìn)行緩存; Redis支持每秒百萬級(jí)的并發(fā),Map行嗎? Redis有過期機(jī)制,Map有嗎? Redis有豐富的API,支持非常多的應(yīng)

    2024年02月03日
    瀏覽(26)
  • 既然有 HTTP 協(xié)議,為什么還要有 RPC

    既然有 HTTP 協(xié)議,為什么還要有 RPC

    什么是HTTP HTTP 協(xié)議( H yper T ext T ransfer P rotocol),又叫做 超文本傳輸協(xié)議 。平時(shí)上網(wǎng)在瀏覽器上敲個(gè)網(wǎng)址就能訪問網(wǎng)頁,這里用到的就是HTTP協(xié)議。 什么是RPC RPC ( R emote P rocedure C all),又叫做 遠(yuǎn)程過程調(diào)用 。它并不是一個(gè)具體的協(xié)議,而是一種 調(diào)用方式 。 像之前的單體

    2024年02月09日
    瀏覽(34)
  • 既然有HTTP協(xié)議,為什么還要有RPC?

    既然有HTTP協(xié)議,為什么還要有RPC?

    我想起了我剛工作的時(shí)候,第一次接觸RPC協(xié)議,當(dāng)時(shí)就很懵, 我HTTP協(xié)議用得好好的,為什么還要用RPC協(xié)議? ? 于是就到網(wǎng)上去搜。 ? 不少解釋顯得非常官方,我相信大家在各種平臺(tái)上也都看到過,解釋了又好像沒解釋,都在 用一個(gè)我們不認(rèn)識(shí)的概念去解釋另外一個(gè)我們不

    2024年02月09日
    瀏覽(31)
  • 云服務(wù)器那么安全穩(wěn)定,為什么大廠還要自建機(jī)房

    云服務(wù)器那么安全穩(wěn)定,為什么大廠還要自建機(jī)房

    一般來說選擇自建機(jī)房或者是云服務(wù)商要考慮的幾個(gè)問題 成本 安全性 管理 通常來說自建機(jī)房,需要自己考慮很多問題,比如 電費(fèi) 網(wǎng)絡(luò) Raid 可靠性 安全性 還要計(jì)算運(yùn)維的成本 似乎從哪個(gè)角度來說,自建機(jī)房都是不大劃算的。 但是為什么還有一些公司要自建機(jī)房呢? 首先

    2023年04月08日
    瀏覽(29)
  • 【容器架構(gòu)】你知道有 Docker 為什么還要 K8s 嗎?

    【容器架構(gòu)】你知道有 Docker 為什么還要 K8s 嗎?

    ?? 博主介紹 : 博主從事應(yīng)用安全和大數(shù)據(jù)領(lǐng)域,有8年研發(fā)經(jīng)驗(yàn),5年面試官經(jīng)驗(yàn),Java技術(shù)專家,WEB架構(gòu)師,阿里云專家博主,華為云云享專家,51CTO TOP紅人 Java知識(shí)圖譜點(diǎn)擊鏈接: 體系化學(xué)習(xí)Java(Java面試專題) ???? 感興趣的同學(xué)可以收藏關(guān)注下 , 不然下次找不到喲

    2024年02月16日
    瀏覽(22)
  • Netty為什么高效,為什么這么受歡迎?

    Netty為什么高效,為什么這么受歡迎?

    上篇文章通過 Java NIO 的處理流程與 Netty 的總體流程比較,并結(jié)合 Netty 的源碼,可以更加清晰地理解Netty。本文將結(jié)合源碼詳細(xì)解析Netty的高效和強(qiáng)大功能的設(shè)計(jì)原理,學(xué)習(xí) Netty 是如何實(shí)現(xiàn)其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的設(shè)計(jì)思想。 我們先看

    2024年02月12日
    瀏覽(40)
  • 區(qū)塊鏈到底是什么,為什么這么火爆

    區(qū)塊鏈到底是什么,為什么這么火爆

    一、相關(guān)背景介紹 互聯(lián)網(wǎng)上的貿(mào)易,幾乎都需要借助可資信賴的第三方信用機(jī)構(gòu)來處理電子支付信息。這類系統(tǒng)仍然內(nèi)生性地受制于“基于信用的模式”。 區(qū)塊鏈技術(shù)是構(gòu)建比特幣區(qū)塊鏈網(wǎng)絡(luò)與交易信息加密傳輸?shù)幕A(chǔ)技術(shù)。它基于密碼學(xué)原理而不基于信用,使得任何達(dá)成

    2023年04月08日
    瀏覽(22)
  • Kafka為什么這么快?

    Kafka 是一個(gè)基于發(fā)布-訂閱模式的消息系統(tǒng),它可以在多個(gè)生產(chǎn)者和消費(fèi)者之間傳遞大量的數(shù)據(jù)。Kafka 的一個(gè)顯著特點(diǎn)是它的高吞吐率,即每秒可以處理百萬級(jí)別的消息。那么 Kafka 是如何實(shí)現(xiàn)這樣高得性能呢?本文將從七個(gè)方面來分析 Kafka 的速度優(yōu)勢(shì)。 零拷貝技術(shù) 僅可追加

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包