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