1、c++語言基礎

1. 程序員的第一條代碼"Hello,world!"

#include <cstdio> //頭文件,主要負責輸入、輸出
using namespace std;//C++標準程序庫中的全部標識符都被定義於一個名爲std,注意後面的";"
int main(){//主程序,程序的開始,一個程序只能有一個主程序,格式固定
    printf("Hello,world!\n");//printf是一個輸出語句,功能定義在cstdio文件,名字定義在std
    return 0;//固定格式,和int對應,正確執行,返回值0
}

  上面代碼是寫給程序員看的叫源程序,但計算機並看不懂,因此咱們要對上面的代碼進行編譯,編譯錯誤說明咱們沒有按照語法規則寫代碼,須要修改,編譯成功,說明沒有語法錯誤,Dev會把源程序轉換成計算可以'讀懂'的目標程序,而後咱們執行目標程序,計算機就能照咱們要求辦事了。c++

2. 變量

  程序在運行的時候須要把數據都存儲在計算機的內存中,內存中的是由一個個基本的存儲單元組合而成,每個存儲單元大小是一個字節,每個存儲單元都有一個內存地址,這個內存地址是一個很長的十六進制數,爲了便於操做,咱們用一個字符串來表明這些內存地址,咱們對變量的操做,就至關於在變量所在的內存地址裏存儲或取出數據,這些數據是可變的,因此咱們稱之爲變量。程序員

2.1 命名規則:

  1. 變量名必須以字母或下劃線打頭,名字中間只能由字母、數字和下劃線「_」組成
  2. 變量名的長度不得超過255個字符;
  3. 變量名在有效的範圍內必須是惟一的。
  4. 變量名不能是保留字(關鍵字)
  5. 避免衝突,變量儘可能首字母大寫

2.2 數據類型:

c++中的數據必須有其數據類型,經常使用的基本數據類型有整形、浮點型、字符型、布爾型。每一種數據類型都有本身的數據範圍和在內存中存儲大小。函數

類型 關鍵字 格式控制符 存儲(字節) 範圍
短整型 short int %hd 2 \(-2^{15}\)~\(2^{15}-1\)
無符號短整型 unsigned short int %hu 2 \(0\)~\(2^{16}-1\)
整型 int %d 4 \(-2^{31}\)~\(2^{31}-1\)
無符號整型 unsigned int %u 4 \(0\)~\(2^{32}-1\)
長整型 long long %lld 8 \(-2^{63}\)~\(2^{63}-1\)
無符號長整型 unsigned long long %llu 8 \(0\)~\(2^{64}-1\)
單精度浮點型 float %f 4 6~7位有效位數
雙精度浮點型 double %lf 8 15~16位有效數
長雙精度浮點型 long double %llf 16 18~19位有效數
字符型 char %c 1
布爾型 bool 1 c++有,c無

2.3 變量定義:

用於爲變量分配存儲空間,還可爲變量指定初始值。變量在使用前必需要定義。spa

int a;//定義一個變量名叫a的變量,這個變量在內存裏佔據4個字節的存儲單元,此內存單元內可能有其餘程序結束後留下的數據,因此初值不固定,通常須要初始化。
double b;//定義一個雙精度浮點變量b,佔8個字節的存儲單元
float a;//錯誤,變量a已存在,不能重複定義
float int;//錯誤,int位系統關鍵字不能做爲變量名

3. 輸入、輸出

  • c語言格式化輸入輸出:scanf、printf3d

    1. 須要包含頭文件
    2. 是格式化輸入輸出,每一種數據類型都有其格式控制符,必須嚴格對應
    3. 書寫比較麻煩,但聯賽建議你們使用,由於其比輸入輸出流要快。

    3.1 格式化輸入scanf

    1. 函數原型:int scanf(const char *format,...);
    2. 函數返回值:成功格式化解析的格式。
    3. 調用格式:scanf(" <格式化字符串> ", <地址列表> );
    4. 注意格式控制符和地址列表要一一對應
    int a,b,c;//定義三個整型變量a,b,c
    c=scanf("%d%d",&a,&b);//格式化字符串要用雙引號引發來,注意取地址符&
    1. "*"符:用以表示該輸入項,讀入後不賦予相應的變量,即跳過該輸入值。
    scanf("%d%*d%d",&a,&b);//輸入1 2 3時,1賦予a,3賦予b,2被跳過
    1. 寬度:用十進制整數指定輸入的寬度(即字符數)。
    scanf("%3d%3d",&a,&b);//輸入12345678時,a=123,b=456
    1. 在輸入多個數值數據時,格式控制串中的間隔則可用空格,TAB做間隔
    scanf("%d%d",&a,&b);
    scanf("%d %d",&a,&b);
    scanf("%d   %d",&a,&b);
    //以上三種方式同樣的,都可
    1. 若是格式控制串中有非格式字符則輸入時也要輸入該非格式字符。
    scanf("%d,%d",&a,&b);//輸入時兩個數之間也必須用","隔開,如:12,13
    1. 如輸入的數據與輸出的類型不一致時,雖然編譯可以經過,但結果將不正確
    scanf("%d%d",&a,&b);//輸入:12 ab時,a=12而b的值不正確

    3.2 格式化輸出printf

    1. 函數原型:int printf(const char *format,[argument]);
    2. 函數返回值爲整型。若成功則返回輸出的字符數,輸出出錯則返回負值。
    3. 調用格式:printf(" <格式化字符串> ", <參量表> );
    4. 要求格式字符串和各輸出項在數量和類型上應該一一對應
    int a,b,c;//定義三個整型變量
    scanf("%d%d%d",&a,&b,&c);//從鍵盤輸入三個整數分別賦給a,b,c
    printf("%d %d %d",a,b,c);//輸出三個變量,用空格隔開,注意變量列表和地址列表的區別
    1. 非格式字符串原樣輸出,在顯示中起提示做用。
    printf("a=%d b=%d c=%d",a,b,c);//非格式字符都會原樣輸出
    1. 轉義字符
    printf("%d %d %d\n",a,b,c);//"\n"是轉義字符,表示換行
    1. 場寬,即輸出的最小寬度,變量值寬度超過最小場寬,用實際寬度顯示
    printf("%5d %6d\n",a,b);//變量a,b輸出最少佔5個字符,不夠左邊補格
    prinf("%-5d %6d\n",a,b);//變量a最少佔5個字符,不夠右邊補空格,b同上
    printf("%5d %5d\n",a,b);//若是a或b自己超過了5個字符,則按實際寬度輸出
    1. 精度,即實數保留的小數位數
    float x,y;
    printf("%5.2f %5.2\n",x,y);//5表示場寬,同上,.2表示保留2位小數位
    printf("%-5.2f\n",x);//不夠5位(包括小數點),右邊補空格

4. 運算符

4.1 賦值運算符"="

語法:變量=表達式code

  1. 賦值語句的左邊必須是變量,左邊是表達式。eg:a=a+b*c+3;
  2. 賦值語句是先把右邊的表達式運算出一個具體的值,而後把這個值存儲在左邊變量所申請的內存地址裏
  3. 因爲賦值運算符「=」右邊的表達式也能夠是賦值表達式,所以, 變量=變量=…=表達式;是成立的。eg:a=b=c=5;
  4. 若是左邊的變量類型和右邊的表達式求出的結果類型不一致,將把右邊的值轉換成左邊的類型再賦值。

4.2 算術運算符

假設變量A=10,B=20orm

運算符 描述 實例
+ 把兩個操做數相加 A + B 將獲得 30
- 從第一個操做數中減去第二個操做數 A - B 將獲得 -10
* 把兩個操做數相乘 A * B 將獲得 200
/ 分子除以分母 B / A 將獲得 2
% 取模運算符,整除後的餘數 B % A 將獲得 0
++ 自增運算符,整數值增長 1 A++ 將獲得 11
-- 自減運算符,整數值減小 1 A-- 將獲得 9
  1. 兩整數相除,答案是其商,也爲整數.eg: 3/2 結果爲:1
  2. 除數或被除數有一個爲實數,答案爲實數eg:3.0/2 結果爲:1.5
  3. %只能對整數取餘.eg:3%2 結果爲:1
  4. 自加、自減運算
int a,b,i=1;
a=i++;//變量i先把本身的值賦值給變量a,而後i本身加1,變成2,因此a==1,i==2
b=++i;//變量i先把本身加1變成3,而後把值賦值給變量b,因此b==3,i==3
//i--;--i;同上

4.3 關係運算符

下表顯示了 C++ 支持的關係運算符。假設變量 A = 10,變量 B=20,則:內存

運算符 描述 實例
== 檢查兩個操做數的值是否相等,若是相等則條件爲真。 (A == B) 不爲真。
!= 檢查兩個操做數的值是否相等,若是不相等則條件爲真。 (A != B) 爲真。
> 檢查左操做數的值是否大於右操做數的值,若是是則條件爲真。 (A > B) 不爲真。
< 檢查左操做數的值是否小於右操做數的值,若是是則條件爲真。 (A < B) 爲真。
>= 檢查左操做數的值是否大於或等於右操做數的值,若是是則條件爲真。 (A >= B) 不爲真。
<= 檢查左操做數的值是否小於或等於右操做數的值,若是是則條件爲真。 (A <= B) 爲真。

4.4 邏輯運算符

下表顯示了 C++ 支持的關係邏輯運算符。假設變量 A = 1,變量 B = 0,則:字符串

運算符 描述 實例
&& 稱爲邏輯與運算符。若是兩個操做數都非零,則條件爲真。 (A && B) 爲假。
|| 稱爲邏輯或運算符。若是兩個操做數中有任意一個非零,則條件爲真。 (A || B) 爲真。
! 稱爲邏輯非運算符。用來逆轉操做數的邏輯狀態。若是條件爲真則邏輯非運算符將使其爲假。 !(A && B) 爲真。

5. 常量

  • 常量是固定值,在程序執行期間不會改變。這些固定的值,又叫作字面量。常量能夠是任何的基本數據類型,好比整數常量、浮點常量、字符常量,或字符串字面值,也有枚舉常量。常量就像是常規的變量,只不過常量的值在定義後不能進行修改。

5.1 整數常量

  • 整數常量能夠是十進制、八進制或十六進制的常量。前綴指定基數:0x0X 表示十六進制,0 表示八進制,不帶前綴則默認表示十進制。原型

  • 整數常量也能夠帶一個後綴,後綴是 UL 的組合,U 表示無符號整數 unsignedL 表示長整數 long int。後綴能夠是大寫,也能夠是小寫,U 和 L 的順序任意。

  • 下面列舉幾個整數常量的實例:

    212         //合法的
    215u        //合法的
    0xFeeL      //合法的
    078         //非法的:8 不是八進制的數字
    032UU       //非法的:不能重複後綴

5.2 浮點常量

  • 浮點常量由整數部分小數點小數部分指數部分組成。

  • 浮點型常量有多種寫法。其基本形式是首先寫整數部分(能夠帶符號),接着寫小數部分,而後寫 e或者 E,最後再寫一個有符號整數

  • eE 被稱爲階碼標誌,eE 後面的有符號整數被稱爲階碼。階碼錶明 10 的階碼次方。\(eg: 1.2E+5\) 等價與\(1.2*10^5\)

  • 下面列舉幾個浮點常量的實例:

    3.14159       // 合法的
    3.14159e+5    // 合法的,等價與 3.14159*10^(5)
    3.14159e5    // 合法的,等價與 3.14159*10^(5),能夠省略'+'
    314159E-5    // 合法的,等價與 314159*10^(-5)

    字符串常量

5.3 字符常量

  • 字符常量是括在單引號中,例如,'x'能夠存儲在 char 類型的簡單變量中。

  • 字符常量能夠是一個普通的字符(例如 'x')、一個轉義序列(例如 '\t'),或一個通用的字符(例如 '\u02C0')。

  • 在 C 中,有一些特定的字符,當它們前面有反斜槓時,它們就具備特殊的含義,被用來表示如換行符(\n)或製表符(\t)等。

  • 下表列出了一些這樣的轉義序列碼:

    轉義序列 含義
    \|\
    ' '
    " "
    ? ?
    \a 報警鈴聲
    \b 退格鍵
    \f 換頁符
    \n 換行符
    \r 回車
    \t 水平製表符
    \v 垂直製表符
    \ooo 一到三位的八進制數
    \xhh 一個或多個數字的十六進制數
  • 下面的實例顯示了一些轉義序列字符:

    #include <cstdio>
    int main() {
        printf("Hello\tWorld");
        return 0;   
    }

5.4 字符串常量

  • 字符串字面值或常量是括在雙引號 "" 中的。一個字符串包含相似於字符常量的字符:普通的字符、轉義序列和通用的字符。
  • 您可使用空格作分隔符,把一個很長的字符串常量進行分行。

5.5 定義常量

5.5.1使用 #define 預處理器,也叫宏定義。
  • 定義:#define 常量名 常量表達式
  • 一個標識符被宏定義後,該標識符即是一個宏名
  • 在程序中出現的是宏名,在該程序被編譯前,先將宏名用被定義的字符串替換,這稱爲宏替換,替換後才進行編譯,宏替換是簡單的替換。
  • define命令定義帶參數的宏定義。其定義的通常形式爲:#define 宏名(參數表) 常量表達式

  • 注意常量表達式儘可能要加括號,否則會獲得意外的結果,通常不建議使用複雜的表達式
#define 常量名 常量表達式
eg:
#include <cstdio> 
#define LENGTH 10
#define WIDTH  5
#define add(x,y) (x+y)//注意要加括號否則會出現
#define NEWLINE '\n' 
int main() { 
   int area;  
   area = LENGTH * WIDTH;
   printf("value of area : %d\n", area);
   printf("%c\n", NEWLINE);
   printf("%d\n", 5*add(LENGTH,WIDTH));//若是不加括號會有意外驚喜
   return 0;
}
5.5.2 使用 const關鍵字。
  • 您可使用 const 前綴聲明指定類型的常量,以下所示:

    const 數據類型 變量名 = 常量表達式;

6. 自動類型轉換

  • 一個表達式中出現不一樣類型間的混合運算,較低類型將自動向較高類型轉換。

  • 不一樣數據類型之間的差異在於數據的表示範圍及精度上,通常狀況下,數據的表示範圍越大精度越高,其類型也越「高級」。

  • 整型類型級別從低到高依次爲:

    int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long
  • 浮點型級別從低到高依次爲:

    float -> double
  • 操做數中沒有浮點型數據時:

    • 當 char、unsigned char、short 或 unsigned short 出如今表達式中參與運算時,通常將其自動轉換爲 int 類型
    • 特殊狀況下 unsigned short 也可能轉換成 unsigned int(如 Turbo C2.0 中,short 和 int 所佔字節數相同,unsigned short 的正數表示範圍比 int 大,故將其轉換爲 unsigned int)。
  • 橾做數中有浮點型數據時:

    • 當操做數中含有浮點型數據(float 或 double)時,全部操做數都將轉換爲 double 型。

      3+5.3f+1.7 //算術表達式中操做數 1.7 爲雙精度浮點數,故先把 3 和單精度浮點數 5.3 自動提高爲雙精度浮點數後,參與運算。運算結果爲雙精度浮點數 10.0。
  • 賦值運算符兩惻的類型不一致時:

    • 當賦值運算符的右值(可能爲常量、變量或表達式)類型與左值類型不一致時,將右值類型可能提高或下降爲左值類型

    • 右值超出左值類型範圍時:將把該右值截斷後,賦給左值。

      double d=5.1f;//右值單精度浮點型常量 5.1 提高爲雙精度浮點型後,再賦值給 d
      int i=5.1; //右值雙精度浮點型 5.1 下降爲左值整型,即 5.1 捨棄小數部分後,把 5 賦給整型變量 i,這種狀況會丟失精度
      char c; //char 佔8位,表示範圍-127〜128
      c=1025; //1025 對應二進制形式:100 0000 0001,超出了8位,因此c爲1
  • 當 return 後的表達式類型與函數的返回值類型不一致時,也會自動把 return 後表達式的值轉換爲函數類型後,再返回。

  • 當函數調用時,所傳實參與形參類型不一致時,也會把實參自動轉換爲形參類型後再賦值。

7. 強制類型轉換

  • 雖然自動類型轉換不須要人工干預,使用方便,但有利也有弊,尤爲當自動類型轉換是從較高類型轉換爲較低類型時,將會下降精度或截斷數據,可能得不到預期的結果。

  • 其通常形式爲: (類型說明符) (表達式)

  • 表達式若是隻有一個變量能夠省略小括號

    #include <cstdio> 
    int main() {
       int sum = 17, count = 5;
       double mean,ans;
       mean = (double) sum / count;//把變量sum強制轉換成實數
       ans = (double) (sum + count)/2;//先計算sum+count的值,而後把int型結果抓成double
       printf("Value of mean : %f\n", mean ); 
    }
  • 類型轉換隻是臨時性的,不管是自動類型轉換仍是強制類型轉換,都只是爲了本次運算而進行的臨時性轉換,轉換的結果也會保存到臨時的內存空間,不會改變數據原本的類型或者值

8. 經常使用的算術轉換

經常使用的算術轉換是隱式地把值強制轉換爲相同的類型。若是操做數類型不一樣,則它們會被轉換爲下列層次中出現的最高層次的類型

相關文章
相關標籤/搜索