-
我們把焦點(diǎn)放到這個(gè)
?int a;?
上面。在 C++ 中,我們通常管這行代碼叫做聲明了一個(gè)變量,這個(gè)變量的名字叫做 a,而前面的 int,表示這個(gè)變量可以存放一個(gè)整型的數(shù)據(jù)類(lèi)型,整型的意思就是整數(shù)。聲明常量和聲明一個(gè)變量非常像,不一樣的地方就是在前面加了一個(gè) const。這個(gè) const 代表的就是不可變的。
查看全部 -
首先是 (int argc,char **argv) ,這是一個(gè)參數(shù)列表。我們可以看到,這里有兩個(gè)參數(shù),第一個(gè)參數(shù)argc表示參數(shù)個(gè)數(shù),第二個(gè)參數(shù)argv是參數(shù)組,兩個(gè)參數(shù)一起表達(dá)了這個(gè)程序的啟動(dòng)參數(shù)。
查看全部 -
c++中的第一個(gè)程序
#include <iostream>
int main()
{
? ? std::cout<<"Hello World! This is C++ Style\n"<<std::endl;
? ? return 0;
}
查看全部 -
我們知道,函數(shù)在工作的以后,C++ 會(huì)為函數(shù)分配相應(yīng)的內(nèi)存,而且還存在參數(shù)的拷貝。這些就導(dǎo)致函數(shù)在調(diào)用的時(shí)候會(huì)帶來(lái)額外的內(nèi)存消耗。
?
但是函數(shù)又是一個(gè)可以讓程序變得模塊清晰的東西。那么有沒(méi)有什么辦法又能讓我們使用函數(shù),而又不帶來(lái)更多的性能消耗呢?
?
C++ 為我們提供了一種函數(shù)形式,叫做內(nèi)聯(lián)函數(shù)。在程序編譯的時(shí)候,編譯器會(huì)把內(nèi)聯(lián)函數(shù)的代碼復(fù)制出來(lái),粘貼到調(diào)用的地方。例如如下代碼:
int add(int a, int b)
{
? ?return a + b;
}
int main(int argc,char **argv)
{
? ?int a = 5;
? ?int b = 10;
? ?int c = add(a + b);
? ?return 0;
}?
如果我們把 int add(int a, int b) 函數(shù)編程內(nèi)聯(lián)函數(shù),那么這段程序在編譯的時(shí)候,將會(huì)被自動(dòng)處理成這樣:
int main(int argc,char **argv)
{
? ?int a = 5;
? ?int b = 10;
? ?int c = a + b;
? ?return 0;
}可以看到,經(jīng)過(guò)編譯器處理,這里就不再有函數(shù)的調(diào)用了。
?
那么如何把一個(gè)函數(shù)變成內(nèi)聯(lián)函數(shù)呢?只需要在函數(shù)前面加 inline 關(guān)鍵字就可以了。
inline int add(int a, int b)
{
? ?return a + b;
}聯(lián)函數(shù)有好處,就是可以節(jié)省調(diào)用時(shí)候的額外開(kāi)銷(xiāo)。但是同時(shí)也會(huì)造成另外的問(wèn)題,內(nèi)聯(lián)是以代碼膨脹為代價(jià)而進(jìn)行的優(yōu)化,而如果一個(gè)函數(shù)過(guò)長(zhǎng),或者一個(gè)函數(shù)被調(diào)用了好多次,那么顯然就不是適合使用內(nèi)聯(lián)函數(shù)優(yōu)化。
?
其實(shí)現(xiàn)代的編譯器,會(huì)對(duì)代碼進(jìn)行足夠的優(yōu)化,有些時(shí)候,你寫(xiě)了內(nèi)聯(lián)函數(shù),但是編譯器不一定會(huì)按照內(nèi)聯(lián)去優(yōu)化,而有的函數(shù),你沒(méi)有寫(xiě)內(nèi)聯(lián),他卻會(huì)給你優(yōu)化成內(nèi)聯(lián)。所以大家在初學(xué) C++ 的時(shí)候其實(shí)沒(méi)必要太糾結(jié)內(nèi)聯(lián)函數(shù)的實(shí)際優(yōu)化效果。
查看全部 -
以上是值傳遞的概念,單純地將a的值進(jìn)行調(diào)用,change函數(shù)里的a變成了4,但是main函數(shù)里面的還是5,因?yàn)閏hange函數(shù)執(zhí)行完畢就銷(xiāo)毀了里面的變量,所以其實(shí)change和main里的a完全是兩個(gè)東西。
這里進(jìn)行了址傳遞,因?yàn)楹瘮?shù)本質(zhì)是將a的地址傳遞到了change函數(shù)里,所以改變的是a地址里的數(shù)據(jù),這樣主函數(shù)和調(diào)用函數(shù)的內(nèi)容就一致了。
查看全部 -
int main(int argc,char **argv)
{
? ?Week week = Week::Fri;
? ?return 0;
}eunm 變量 類(lèi)似于數(shù)組的變量=變量::變量展開(kāi)定義的相對(duì)值
enum Week
{
? ?Mon, // 星期一
? ?Tue, // 星期二
? ?Wed, // 星期三
? ?Thu, // 星期四
? ?Fri, // 星期五
? ?Sat, // 星期六
? ?Sun, // 星期日
};跟struct一樣
定義之后要加分號(hào)
查看全部 -
在函數(shù)調(diào)用的時(shí)候,依照函數(shù)定義時(shí)參數(shù)列表的順序依次傳入想要傳入的值。在使用的時(shí)候,參數(shù)的順序不可以改變。
int func(int a, float b)
上面的函數(shù)在調(diào)用的時(shí)候,傳入的第一個(gè)參數(shù) a 是int型,第二個(gè)參數(shù)?b 是float型。不能顛倒兩者的順序,如果顛倒,則可能發(fā)生語(yǔ)法錯(cuò)誤,或者進(jìn)行數(shù)據(jù)類(lèi)型的隱式轉(zhuǎn)換。
查看全部 -
在 C++ 中,函數(shù)要想使用,必須要先聲明。所以我們可以在調(diào)用之后實(shí)現(xiàn)函數(shù)體,但是必須在調(diào)用之前聲明。
#include <stdio.h>
//定義函數(shù)
int avg(int a, int b)
{
? ?return a + b / 2;
}
int main(int argc,char **argv)
{
? ?int a = 10;
? ?int b = 20;
? ?int c = avg(a, b); //函數(shù)調(diào)用
? ?return 0;
}查看全部 -
if(a == 12){
? ?b = a - b;
}
else{
? ?b = a + b;
? ?b = a - b;
}等價(jià)于:
do {
? ?if(a == 12){
? ? ? ?break;
? ?}
? ?b = a + b;
} while(false);
b = a - b;在這個(gè)語(yǔ)句中,while(false)永遠(yuǎn)不會(huì)運(yùn)行這個(gè)循環(huán),用于延時(shí)設(shè)計(jì)。
while(true)會(huì)讓程序一直執(zhí)行,死循環(huán)。
查看全部 -
這就是 switch case 的特殊的地方,他在匹配到相應(yīng)的 case 之后,會(huì)將后面所有的 case 從句都執(zhí)行一次,直到碰到一個(gè) break 語(yǔ)句。如果想讓這段程序符合預(yù)期,我們就要這么寫(xiě):
#include <stdio.h>
int main(int argc,char **argv)
{
? ?int s = 5;
? ?switch (s) {
? ? ? ?case 1:
? ? ? ? ? ?printf("1\n");
? ? ? ? ? ?break;
? ? ? ?case 2:
? ? ? ? ? ?printf("2\n");
? ? ? ? ? ?break;
? ? ? ?case 3:
? ? ? ? ? ?printf("3\n");
? ? ? ? ? ?break;
? ? ? ?case 4:
? ? ? ? ? ?printf("4\n");
? ? ? ? ? ?break;
? ? ? ?case 5:
? ? ? ? ? ?printf("5\n");
? ? ? ? ? ?break;
? ? ? ?case 6:
? ? ? ? ? ?printf("6\n");
? ? ? ? ? ?break;
? ? ? ?case 7:
? ? ? ? ? ?printf("7\n");
? ? ? ? ? ?break;
? ? ? ?case 8:
? ? ? ? ? ?printf("8\n");
? ? ? ? ? ?break;
? ? ? ?case 9:
? ? ? ? ? ?printf("9\n");
? ? ? ? ? ?break;
? ? ? ?case 10:
? ? ? ? ? ?printf("10\n");
? ? ? ? ? ?break;
? ? ? ?default:
? ? ? ? ? ?printf("unknow\n");
? ?}
? ?return 0;
}查看全部 -
在 C++ 中,數(shù)組表示的是一段連續(xù)的內(nèi)存存儲(chǔ)空間。
假設(shè)我們想要訪(fǎng)問(wèn)第 2 個(gè)元素(從 0 開(kāi)始)
array[1];
那么 C++ 在碰到這行代碼的時(shí)候,是先拿到第 2 個(gè)元素的地址,然后通過(guò)地址去訪(fǎng)問(wèn)元素,那么如何拿到第二個(gè)元素的地址呢?剛剛的實(shí)驗(yàn)證明,數(shù)組中元素的地址都是等差的,所以只要拿到第一個(gè)元素的地址,再加上相應(yīng)元素的偏差,就可以拿到第二個(gè)元素的地址了。
直接輸出 array 和首元素的地址,是一模一樣的,那么就可以得出一個(gè)結(jié)論:數(shù)組名是一個(gè)指向數(shù)組首元素的指針,但是這個(gè)指針和我們常見(jiàn)的指針有一些不一樣的地方,這個(gè)指針是一個(gè)常量,所以我們是不可以對(duì)其進(jìn)行修改的。
代碼中的?*(array + 2) = 1;?就等價(jià)于?array[2] = 1;
假如想要訪(fǎng)問(wèn)第 3 個(gè)數(shù)字,我們可以把指針向后移動(dòng)兩個(gè)元素的位置,寫(xiě)成?*(p + 2)
那么指針可不可以按照數(shù)組的訪(fǎng)問(wèn)方式去訪(fǎng)問(wèn)呢?p[2]
其實(shí)也是可以的,p[2]和*(p + 2)在這里是等價(jià)的。
查看全部 -
變量只在一定的范圍內(nèi)有效,上面的例子中,b只在大括號(hào)(代碼塊)里有效。
代碼在大括號(hào)外面會(huì)自動(dòng)銷(xiāo)毀里面的變量,所以b也叫自動(dòng)變量。(棧內(nèi)存)
為p指針?lè)峙湟黄?字節(jié)的堆內(nèi)存,這樣p在內(nèi)存外也可以使用。
堆內(nèi)存用完之后,要用free(p)來(lái)釋放這片內(nèi)存。
查看全部 -
int a=2
int *p=&a
等價(jià)于:
*p=2
野指針指的是沒(méi)有指明地址的指針,直接操作會(huì)很危險(xiǎn)
我們可以先賦值一個(gè)空指針,但不要直接定義int *p;
可以這樣int*p=nullptr;
查看全部 -
enum Week
{
? ?Mon, // 星期一
? ?Tue, // 星期二
? ?Wed, // 星期三
? ?Thu, // 星期四
? ?Fri, // 星期五
? ?Sat, // 星期六
? ?Sun, // 星期日
};
int main(int argc,char **argv)
{
? ?Week week = Week::Fri;
? ?return 0;
}在這段程序里,week 這個(gè)枚舉變量,只能是定義好的 7 個(gè)值,不能是其他的值,而且在賦值的時(shí)候,你可以直接看出來(lái)這個(gè)值是什么,而不用再去和數(shù)字進(jìn)行對(duì)應(yīng)。這樣就可以最大限度得減少出錯(cuò)的可能性了。
查看全部 -
%d占位符
查看全部
舉報(bào)