變量
變量其實(shí)只不過是程序可操作的存儲(chǔ)區(qū)的名稱掠归。 C++ 中每個(gè)變量都有指定的類型掀亩,類型決定了變量存儲(chǔ)的大小和布局,該范圍內(nèi)的值都可以存儲(chǔ)在內(nèi)存中锻离,運(yùn)算符可應(yīng)用于變量上铺峭。
C++ 中的變量聲明
變量聲明向編譯器保證變量以給定的類型和名稱存在,這樣編譯器在不需要知道變量完整細(xì)節(jié)的情況下也能繼續(xù)進(jìn)一步的編譯汽纠。變量聲明只在編譯時(shí)有它的意義卫键,在程序連接時(shí)編譯器需要實(shí)際的變量聲明怜庸。
int i, j, k;
char c, ch;
float f, salary;
double d;
extern int d = 3, f = 5; // d 和 f 的聲明
int d = 3, f = 5; // 定義并初始化 d 和 f
byte z = 22; // 定義并初始化 z
char x = 'x'; // 變量 x 的值為 'x'
不帶初始化的定義:帶有靜態(tài)存儲(chǔ)持續(xù)時(shí)間的變量會(huì)被隱式初始化為 NULL(所有字節(jié)的值都是 0)嗽测,其他所有變量的初始值是未定義的。
C++ 中的左值(Lvalues)和右值(Rvalues)
C++ 中有兩種類型的表達(dá)式:
- 左值(lvalue):指向內(nèi)存位置的表達(dá)式被稱為左值(lvalue)表達(dá)式陕悬。左值可以出現(xiàn)在賦值號(hào)的左邊或右邊碴犬。
- 右值(rvalue):術(shù)語右值(rvalue)指的是存儲(chǔ)在內(nèi)存中某些地址的數(shù)值絮宁。右值是不能對(duì)其進(jìn)行賦值的表達(dá)式,也就是說服协,右值可以出現(xiàn)在賦值號(hào)的右邊绍昂,但不能出現(xiàn)在賦值號(hào)的左邊。
變量是左值偿荷,因此可以出現(xiàn)在賦值號(hào)的左邊窘游。數(shù)值型的字面值是右值,因此不能被賦值跳纳,不能出現(xiàn)在賦值號(hào)的左邊忍饰。下面是一個(gè)有效的語句:
int g = 20;
但是下面這個(gè)就不是一個(gè)有效的語句,會(huì)生成編譯時(shí)錯(cuò)誤:
10 = 20;
C++ 變量作用域 variable scope
作用域是程序的一個(gè)區(qū)域寺庄,一般來說有三個(gè)地方可以定義變量:
- 在函數(shù)或一個(gè)代碼塊內(nèi)部聲明的變量艾蓝,稱為局部變量(local variable)力崇。
- 在函數(shù)參數(shù)的定義中聲明的變量,稱為形式參數(shù)(parameter)赢织。
- 在所有函數(shù)外部聲明的變量餐曹,稱為全局變量(global variable)。
變量的初始化
// initialization of variables
#include <iostream>
using namespace std;
int main ()
{
int a=5; // initial value: 5 C風(fēng)格初始化
int b(3); // initial value: 3 ()初始化
int c{2}; // initial value: 2 {}初始化
int result; // initial value undetermined
a = a + b;
result = a - c;
cout << result;
return 0;
}
以上敌厘,初始化變量的所有三種方式在C++中都是有效且等效的台猴。
類型扣除:auto和decltype
初始化新變量時(shí),編譯器可以通過初始化程序自動(dòng)確定變量的類型俱两。為此饱狂,只需使用auto變量的類型說明符:
int foo = 0;
auto bar = foo; // the same as: int bar = foo;
這里,bar
聲明有一個(gè)auto
類型; 因此宪彩,type bar
是用于初始化它的值的類型:在這種情況下休讳,它使用的類型foo
是int
。
未初始化的變量也可以使用帶有說明decltype
符的類型推導(dǎo):
int foo = 0;
decltype(foo) bar; // the same as: int bar;
這里尿孔,bar
被聲明為具有相同的類型foo
俊柔。
auto
并且decltype
是最近添加到該語言的強(qiáng)大功能。但是活合,它們引入的類型推導(dǎo)功能意味著在通過其他方式無法獲得類型或使用它時(shí)提高代碼可讀性時(shí)使用雏婶。上面的兩個(gè)例子可能都不是這些用例。事實(shí)上白指,它們可能降低了可讀性留晚,因?yàn)樵陂喿x代碼時(shí),必須搜索foo
實(shí)際知道類型的類型bar
告嘲。