《C Primer》 第二章 變數和基本型別

2021-09-30 04:23:57 字數 4080 閱讀 6640

各種程式語言都具有許多獨具特色的特徵,這些特徵決定了用每種語言適合開發哪些型別的應用程式。

程式語言也有一些共同的特徵:

內建資料型別;

表示式和語句:用於操縱上述型別的值;

變數;控制結構;

函式。大多數現代程式語言都採用兩種方式擴充上述基本特徵集:

1.允許程式設計師通過自定義資料型別擴充套件該語言;

2.提供一組庫例程,這些例程定義了一些並非內建在語言中的使用函式和資料型別。

基本內建型別

bool        布林型         不定

char        字元型         8位

wchar_t     寬字元型       16位

short       短整型         16位

int         整型           16位

long        長整型         32位

float       單精度浮點型   6位有效數字

double      雙精度浮點型   10位有效數字

long double 擴充套件精度浮點型 10位有效數字

命名習慣最重要的是保持一致。特別是在多人協同時。

變數名即變數的識別符號(identifier),可以由字母、數字和下劃線組成。必須以字母或下劃線開頭,且區分大小寫字母。

變數名不能是c++關鍵字和操作替代名。

c++標準還保留了一組識別符號用於標準庫。識別符號不能包含兩個連續的下劃線,也不能以下劃線開頭後面緊跟乙個大寫字母。

有些識別符號(在函式外定義的識別符號)不能以下劃線開頭。

int 是c++內建型別,std::string是標準庫定義的型別。

可以這樣定義:

int month,

day,

year;

變數的初始化。

兩種初始化變數的方式:複製初始化(copy-initialization)和直接初始化(direct-initialization)。

int ival(1024); 直接初始化

int ival = 1024; 複製初始化

初始化不是賦值。

初始化指建立變數並給它賦初始值,而賦值則是擦除物件的當前值並用新值代替。

它們兩者的區別很微妙。直接初始化語法更靈活且效率更高。

使用多個初始化式

定義如何進行初始化的成員函式稱為建構函式(constructor)。

std::string all_nines(10,'9');    all_nines = "9999999999"

這裡,初始化all_nines的唯一方法是直接初始化。有多個初始化式時不能使用複製初始化。

初始化多個變數

物件的名字立即變成可見,所以可以用同乙個定義中前面已定義變數的值初始化後面的變數。

已初始化變數和未初始化變數可以在同一定義中定義。兩種形式的初始化文法可以相互混合。

double salary = 9999.9;

wage(salary + 0.1);

物件可以用任意複雜的表示式(包括函式的返回值)來初始化:

double sale_price = a();

宣告和定義

定義 用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且只有乙個定義。

宣告 用於向程式表明變數的型別和名字。定義也是宣告:當定義變數時我們宣告了它的型別和名字。

使用extern關鍵字可以宣告變數名而不定義它。

extern int i;     // declares but does not define i

int i;            // declares and defines i

extern宣告不是定義,也不分配空間。它只是說明變數定義在程式的其他地方。程式中變數可以宣告多次,!!但只能定義一次。

如果宣告有初始化式,那麼它可被當作是定義,即使宣告標記為extern:

extern double pi = 3.1416;  //definition

只有當extern宣告位於函式外部時,才可以含有初始化式。

名字的作用域

在程式中可以多次使用同乙個名字,只要它用在不同的上下文中,且通過這些上下文可以區分該名字的不同意義。

用來區分名字的不同意義的上下文稱為作用域(scope)作用域是程式的一段區域,乙個名字可以和不同作用域中的不同實體相關聯。

c++中,大多數作用域使用花括號來界定的。

定義在函式外部的名字具有全域性作用域(global scope),可以在程式中的任何地方訪問。

在函式內部定義的名字有區域性作用域(local scope),只能在函式內部使用。

而在語句中定義的名字比如for語句有語句作用域(statement scope),只能在這個語句中使用。

c++中作用域可巢狀

定義在全域性作用域中的名字可以在區域性作用域中使用,而全域性和區域性的也可以在語句作用域中使用。即範圍大的能在範圍小的中使用。

名字還可以在內部作用域中重新定義。

區域性變數的重定義能遮蔽(hide)全域性變數。

但是區域性變數最好使用不同的名字。

c++中海油另外兩種不同級別的作用域:類作用域(class scope)和命名空間作用域(namespace scope)

通常把乙個物件定義在它首次使用的地方是乙個很好的方法。

const限定符

定義乙個變數代表某一常數的方法仍然有乙個嚴重的問題。即它可以被有意或無意地修改。

const限定符提供了乙個解決辦法,它把乙個物件轉換成乙個常量。

const int bufsize = 512;

定義bufsize為常量並初始化為512.任何修改bufsize的嘗試都會導致編譯錯誤。

const物件末仍為檔案的區域性變數,可以加上個extern 指定為 全程式都可用。

引用(reference),間接引用,const引用。

typedef名字

typedef通常被用於以下三個目的:

為了隱藏特定型別的實現,強調使用型別的目的。

簡化複雜的型別定義,使其更易理解。

允許一種型別用於多個目的,同時使得每次使用該型別的目的明確。

列舉(enumeration),關鍵字 enum,列舉成員是常量,成員第乙個預設為0,其後依次加1.

類型別每個類(class)都定義了乙個介面(inte***ce)和乙個實現(implementation)。

介面即該類所提供的操作。

class sales_item

; //千萬別忘了這個分號@

類可以為空,類體定義了組成該型別的資料和操作,成為類的成員(member),操作稱為成員函式,而資料稱為資料成員(data member)。

使用該類的**可能只能訪問public成員。

struct關鍵字,相當於class的public;

class中如果不寫public和private,則預設為private;

標頭檔案(header file)

多個檔案分別編譯(separate compilation),

標頭檔案為相關宣告提供了乙個集中存放的位置。標頭檔案一般包括類的定義、extern變數的宣告和函式的宣告。

標頭檔案的好處:

保證所有檔案使用給定實體的同一宣告;

當宣告需要修改時,只有標頭檔案需要更新。

如果標頭檔案太大,可能編譯時間會很長,為了減少處理標頭檔案的編譯時間,可以預編譯標頭檔案。

注意,標頭檔案用於宣告而不是用於定義。只能是extern 型別 名字; //extern不能少,否則就是定義了。

對於標頭檔案不應該含有定義這一規則,有三個例外。標頭檔案可以定義類、值在編譯時就已知的const物件和inline函式。

這些實體可以在多個原始檔中定義,只要都是相同的。

#include設施是c++預處理器(preprocessor)的一部分。在編譯器之前執行。

標頭檔案保護符(header guard)可以避免多重包含

#ifndef salesitem_h

#define salesitem_h

//#endif

標頭檔案應該含有保護符,即使這些標頭檔案不會被其他標頭檔案包含。

標頭檔案如果被包含多次可能會引起難以理解的編譯錯誤。

#include 

#include  "my_file.h"

C Primer 第二章 變數和基本型別

include int main 乙個形如42的值被稱作字面值常量 literal 整型和浮點型字面值20 十進位制 024 八進位制 0x14 十六進製制 浮點數 3.14159 3.14159e0 0.0e0 001字元和字串字面值 分多行書寫的字串字面值 std cout a rea11y,r...

C Primer第二章 變數和基本型別

標籤 空格分隔 未分類 2.2 變數 2.3 復合型別 2.4 const限定符 2.5 處理型別 2.6 自定義資料結構 基本資料型別 算術型別 空型別 void c 保證short和int至少為16位,長至少32位,long long至少為64位。有符號可以表示正數,負數和零,而無符號只能表示不...

C Primer第二章(變數和基本型別)筆記

int main int argc,tchar argv 同乙個作用域不能定義兩次 const int i,j 0 error 常量必須在定義後初始化,i並沒有被初始化 extern const int i,j 合法 int ref error 引用必須被初始化 int ref1 10 error ...