變量其實只不過是程序可操作的存儲區的名稱。C++ 中每個變量都有指定的類型,類型決定了變量存儲的大小和布局,該范圍內的值都可以存儲在內存中,運算符可應用於變量上。
一、基本變量類型
C++ 也允許定義各種其他類型的變量,比如枚舉、指針、數組、引用、數據結構、類等
變量的定義 及 初始化
extern int d = 3, f = 5; // d 和 f 的聲明 int d = 3, f = 5; // 定義並初始化 d 和 f byte z = 22; // 定義並初始化 z char x = 'x'; // 變量 x 的值為 'x'
不帶初始化的定義:帶有靜態存儲持續時間的變量會被隱式初始化為 NULL(所有字節的值都是 0),其他所有變量的初始值是未定義的。
二、變量聲明
變量聲明向編譯器保證變量以給定的類型和名稱存在,這樣編譯器在不需要知道變量完整細節的情況下也能繼續進一步的編譯。變量聲明只在編譯時有它的意義,在程序連接時編譯器需要實際的變量聲明。
當您使用多個文件且只在其中一個文件中定義變量時(定義變量的文件在程序連接時是可用的),變量聲明就顯得非常有用。您可以使用 extern 關鍵字在任何地方聲明一個變量。雖然您可以在 C++ 程序中多次聲明一個變量,但變量只能在某個文件、函數或代碼塊中被定義一次。
#include <iostream> using namespace std; // 變量聲明 extern int a, b; extern int c; extern float f; int main () { // 變量定義 int a, b; int c; float f; // 實際初始化 a = 10; b = 20; c = a + b; cout << c << endl ; f = 70.0/3.0; cout << f << endl ; return 0; }
同樣的,在函數聲明時,提供一個函數名,而函數的實際定義則可以在任何地方進行
// 函數聲明 int func(); int main() { // 函數調用 int i = func(); } // 函數定義 int func() { return 0; }
三、左值和右值
補充:
1.C/C++ 編譯 cpp 文件是從上往下編譯,所以 main 函數里面調用其他函數時,如果其他函數在 main 函數的下面,則要在 main 函數上面先聲明這個函數。
或者把 main 函數放在最下面,這個不僅限於 main 函數,其他函數的調用都是如此。被調用的函數要在調用的函數之前聲明。
2.
3.
4.
5.變量左值可以出現在等式的左邊或者右邊。出現在左邊可以用來判鍛NULL,以防出現邏輯錯誤
#include "stdafx.h" int *a = NULL; int main() { if (a = NULL)//賦值語句,並非判斷語句 { return false; } if (NULL = a)//!!!!ERROR 此處在程序編譯階段不通過,“=”右邊不能為變量名 { return false; } if (a == NULL)//可行 ,判斷指針a是否為空 { return false; } if (NULL == a)//可行 ,判斷指針a是否為空。在實際項目中,為了防止將“==”誤寫作“=”推薦講變量名寫在右側,編譯器可以幫助尋找錯誤 { return false; } return 0; }
6.變量的類型間是可以互相轉換的,轉換又分為自動轉換和強制轉換。
自動轉換規則:
- 1、若參與運算量的類型不同,則先轉換成同一類型,然后進行運算。
- 2、轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型后再進行運算。
a、若兩種類型的字節數不同,轉換成字節數高的類型
b、若兩種類型的字節數相同,且一種有符號,一種無符號,則轉換成無符號類型
- 3、所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。
- 4、char型和short型參與運算時,必須先轉換成int型。
- 5、在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度:
int a=1; double b=2.5; a=b; cout << a; //輸出為 2,丟失小數部分
int a = 1; double b = 2.1; cout << "a + b = " << a + b << endl; //輸出為a + b = 3.1
強制轉換規則:
強制類型轉換是 通過類型轉換運算 來實現的。其一般形式為:(類型說明符)(表達式) 其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型
int a = 1; double b = 2.1; cout << "a + b = " << a + (int)b << endl; //輸出為a + b = 3