C Primer 筆記三 變數

2021-09-10 03:39:04 字數 3226 閱讀 3538

初始化

變數是命名的物件或引用,提供乙個具名的、可供程式操作的儲存空間。定義乙個變數的基本形式是:首先是型別說明符,然後緊跟由逗號分隔的變數名組成的列表,最後以分號結束。

type objlist;

int sum = 0, value;	// 定義兩個int型變數,同時為sum賦初值為0
在c++中,初始化和賦值是兩個完全不同的操作。初始化時建立變數時賦予其乙個初始值,變數一般都應該被初始化;而賦值是抹去物件當前值,以乙個新值來替代。

如果定義變數時沒有指定初值,則變數被預設初始化。定義於任何函式體之外的的變數被預設初始化為0。而定義在函式體內部的內建型別變數將不被初始化,其值是未定義的。類物件如果沒有顯式地初始化,則其值由類決定。

std::string g_str;	// 預設初始化為空字串

int g_int; // 預設初始化為0

int main()

宣告和定義

c++是一種靜態型別語音,即在編譯階段檢查型別。靜態型別檢查要求編譯器必須知道每乙個實體物件的型別,因此變數必須在定義或宣告後才能使用。

宣告規定了變數的型別和名字;定義除了規定變數的型別和名字,還申請了儲存空間,也可能會為變數賦初值。如果想宣告乙個變數而非定義它,就在變數名前新增關鍵字extern,而且不要顯式地初始化變數。任何包含顯式初始化的宣告即成為定義。

extern int i;			// 宣告i而非定義i

int j; // 宣告並定義j;

extern double pi = 3.1416; // 宣告並定義了pi,顯式初始化為3.1416

變數只能被定義一次,但可以多次宣告。在多個檔案中使用同乙個變數,必須將宣告和定義分離,變數的定義有且只能出現在乙個檔案中,絕不可再其他檔案中重複定義。

識別符號

識別符號即變數名,規定:

只能包含字母、數字和下劃線,且必須以字母和下劃線開頭;

不能以c++保留字作為識別符號;

使用者自定義的識別符號中不能連續出現兩個下劃線,也不能以下劃線緊連大寫字母開頭;

定義在函式體外的識別符號不能以下劃線開頭;

沒有長度限制,但大小寫敏感。

c++關鍵字

alignas

constexpr

extern

noexcept

static_assert

union

alignof

const_cast

false

nullptr

static_cast

unsigned

asmcontinue

float

operator

struct

using

auto

decltype

forprivate

switch

virtual

bool

default

friend

portected

template

void

break

delete

goto

public

this

volatile

case

doif

rergister

thread_local

wchar_t

catch

double

inline

reinterpret_cast

throw

while

char

dynamic_cast

intreturn

ture

char16_t

else

long

short

trychar32_t

enum

mutable

signed

typedef

class

explicit

namespace

sizeof

typeid

const

export

newstatic

typename

c++操作符替代名

替代名and

bitand

compl

not_eq

or_eq

xor_eq

and_equ

bitor

notor

xor操作符&&&

~!=|=^

&=|!||

^= 變數命名有很多約定俗成的規範,有助於提高**的可讀性,具體可參考《google c++ 程式設計規範》第六章命名約定。

名字的作用域

c++中大多數作用域都以花括號分隔,同乙個名字在不同的作用域中可能指向不同的實體。名字的有效區域始於名字宣告處,結束於所在作用域的末端。

作用域可以包含彼此,被包含的作用域稱為內層作用域,包含著別的作用域的作用域稱為外層作用域。

作用域中宣告的名字可以被它所巢狀的所有作用域訪問,內層作用域若宣告定義了與外層相同的名字,外層作用域中已存在的名字將被覆蓋。使用作用域操作符(::)可以訪問被覆蓋的外層作用域的名字。

// pro.cpp

#include // reuse擁有全域性作用域

int reuse = 42;

int main()

// 這裡編譯器會報錯

// error: 'inif' was not declared in this scope.

//std::cout << inif << std::endl;

// 覆蓋了全域性變數reuse

double reuse = 3.14;

// 必須使用(::)顯示訪問外層作用域中相同的名字

std::cout << reuse << "\t" << ::reuse << std::endl;

return 0;

}

$ ./pro.out

42 0

1 33

3.14 42

一般來說,不宜定義於全域性作用域同名的區域性變數。

C Primer 筆記 變數

1.初始化不是賦值,初始化的含義是建立變數時賦予其乙個初始值,而賦值的含義是把物件的當前值擦除,而以乙個新值來代替。2.使用列表初始化內建型別的變數時,如果初始值存在丟失資訊的風險,則編譯器將報錯。int i 錯誤 3.如果想宣告乙個變數而非定義它,就在變數名前新增關鍵字extern,而且不要顯示的...

C primer學習筆記(三)

注意事項 sizeof是乙個運算子,而不是函式,雖然用起來非常像函式。作用 返回乙個型別或變數的位元組長度。用法 位於std命名空間內有控制符 dec oct 和 hex,用於更改cout輸出數時的預設進製,預設為十進位制。使用方法如下 其他相關 省略 using namespace std int...

C Primer 筆記之 變數和函式

32位機器上 cout 輸出 4 4 8 8 4也就是說只有long long 以及double是占用8個位元組的。1 引用和指標一樣,是繫結對物件的另外乙個名字,改變它或者它繫結的物件,都會使雙方改變 2 必須是乙個物件的別名,int b 1 是錯的 3 若繫結的物件時const型別,那麼引用也必...