C 學習筆記(一)(變數 宣告 定義 引用)

2021-08-15 08:29:14 字數 3730 閱讀 7480

對於unsigned型別來說,編譯器必須調整越界值使其滿足要求。編譯器會對unsigned型別的可能取值數目求模,然後取得所得值。有些語言中將負數賦予unsigned型別是非法的,但在c++中這是合法的。

對於signed型別來說,很多編譯器處理signed型別的方法與unsigned型別類似,但我們並不能保證所有編譯器都會這麼處理。

例:如果把-1賦給8位的unsigned char,那麼結果是255,因為-1對256取模的結果是255。

型別位元(位)數

精度數值範圍

float

326~7

-2^128 ~ +2^128

double

6415~16

-2^1024 ~ +2^1024

long double

96/128

18~19

-1.2*10-4932~1.2*104932

為了相容c語言,c++中所有的字串字面值都由編譯器自動在末尾新增乙個空字元,字元字面值』a』表示單個字元a,而"a"表示包含字母a和空字元兩個字元的字串。c++中所有的字串字面值都由編譯器自動在末尾新增乙個空字元。

雖然字串"a"為兩個字元的字串,但如果用標準string庫中的size()函式輸出其大小,可以發現仍為1而不是2。

變數是計算機語言中能儲存計算結果或能表示值抽象概念,提供了程式可以操作的有名字的儲存區。c++中每乙個變數都有特定的型別,該型別決定了變數的記憶體大小和布局,能夠儲存於該記憶體中的值的取值範圍以及可應用在該變數上的操作集。c++程式設計師常常把變數稱為「變數」或「物件」。

直接初始化(direct-initialization):

int ival(1024);

複製初始化(copy-initialization):

int ival = 1024;

其中,直接初始化語法更靈活且效率更高。

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

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

宣告(declaration)用於向程式表明變數的型別和名字。

定義是宣告,但宣告未必是定義。

當定義變數時我們宣告了它的型別和名字,可以通過extern關鍵字宣告變數而不定義它。不定義變數的宣告包括物件名,物件型別和物件型別前的關鍵字extern。

例:

extern int i;  //宣告但不定義i

int i; //宣告並且定義i

從上面**可以看出,extern宣告不是定義,也不分配儲存空間。事實上,它只是說明變數定義在程式的其他地方。程式中變數可以宣告多次,但只能定義一次。

只有當宣告也是定義時,宣告才可以有初始化式,因為只有定義才分配空間。初始化式必須要有儲存空間來進行初始化。如果宣告有初始化式,那麼它可以被當作是定義,即使宣告標記為extern;

例:

extern double pi = 3.1416; //定義
上面語句雖然使用了extern,但是這條語句還是定義了pi,分配並初始化了儲存空間,只有當extern宣告位於函式外部時,才可以含有初始化式。

如果已初始化的extern宣告被當作是定義,那麼該變數任何隨後的定義都是錯誤的。

任何在多個檔案中使用的變數都需要與定義分離的宣告。在這種情況下,乙個檔案中含有變數的定義,使用該變數的其他檔案則包含該變數的宣告(而不是定義)。

const的作用是將乙個物件轉化為乙個常量。

const物件預設為檔案的區域性變數,即使它在全域性作用域被宣告,此變數只存在於那個檔案中,不能被其他檔案訪問。要使const變數能夠在其他的檔案被訪問,必須顯式地指定它為extern。

如:

extern const int counter = 1;

extern const int counter; //使用file1中的變數

引用是一種復合型別(compound type),通過在變數名前新增"&"符號來定義。

復合型別是指用其他型別定義的型別。在引用的情況下,每一種引用型別都"關聯到"某一其他型別。

注意點:

不能定義引用型別的引用,但可以定義其他任何型別的引用。

&在此不是求位址運算,而是起標識作用。

當引用初始化後,只要該引用存在,它就保持繫結到初始化時指向的物件,不可能將引用繫結到另乙個物件。

宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,作用在該引用的所有操作實際上都是作用在該引用繫結的物件上,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。故:對引用求位址,就是對目標變數求位址。&ra與&a相等。

不能建立陣列的引用。因為陣列是乙個由若干個元素所組成的集合,所以無法建立乙個陣列的別名。

非const引用只能繫結到與該引用同型別的物件,例如,乙個非const的int 型別的引用只能繫結到乙個int型別的物件;

const int ival1 = 1024;

int ival2 = 1024;

int &refval1 = ival1;//錯誤,非const引用繫結到了const物件

int &refval2 = ival2;//正確,非const引用繫結到同樣型別的物件上

而const引用則可以繫結到不同但相關的型別的物件(只要能從一種型別轉換到另一種型別即可)或繫結到右值,const引用可以初始化為不同型別的物件或者初始化為右值,如字面值常量。例如:

int i = 42;

const int &r = 42;

const int &r2 = r + i;

double dval = 3.14;

const int &ri = dval;

上述的初始化對於const引用而言是正確的,但對於非const引用而言是錯誤的。

引用在內部存放的是乙個物件的位址,它是該物件的別名。對於不可定址的值,如文字常量,以及不同型別的物件,編譯器為了實現引用,必須生成乙個臨時物件,引用實際上指向該物件,但使用者不能訪問它。

例如:

double dval = 23;

const int &ri = dval;

編譯器將其轉化為

int temp = dval; 

const int &ri = temp;

試圖通過const引用去改變它繫結的物件的值是錯誤的,如果它繫結的物件是非const,那麼我們可以通過其它方式去修改它,通過const引用是不可行的。

type可以用來定義型別的同義詞,如:

typedef double wages;
上面**就將wages定義為double的同義詞,在後續**中,可以使用wages代替double。

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

列舉型別是一種資料型別,用於宣告一組命名的常數,當乙個變數有幾種可能的取值時,可以將它定義為列舉型別。

列舉的定義包括關鍵字enum,其後是乙個可選的列舉型別名,和乙個用花括號括起來,用逗號分開的列舉成員(enumerator)列表。

1. 預設第乙個列舉成員賦值為0,其後每個列舉成員賦的值比前面的大1; 2. 不能改變列舉成員的值,列舉成員本身就是乙個常量表示式。 預設訪問級別不同,struct的預設成員為public,而class的預設成員為private。

C 變數宣告定義

1.extern 宣告變數,在乙個檔案裡宣告以後,表示該變數要去其它檔案找變數,告訴編譯器 你現在編譯的檔案中,有乙個識別符號雖然沒有在本檔案或本檔案當前位置中定義,但是它是在別的檔案中或本檔案其它位置定義的全域性變數,你要放行!宣告變數 extern type variable 有extern,無...

函式 變數 宣告 定義 呼叫 引用

引例 在高中數學裡,我們有y f x f x 3x 在c語言裡我們有 includeint f int a int main 下面說一下函式的宣告 定義 呼叫 詳見下面 宣告的作用是把函式名 函式引數的個數 函式引數型別等資訊通知編譯系統,以便在遇到函式呼叫時,編譯系統能正確識別函式並檢查呼叫是否合...

perl學習筆記一 變數

變數 一.直接量 常量 perl中常量和其他語言例如c語言沒什麼太大區別。所以在下面指出一些與其他語言不相同的地方。1.1 數字常量 在perl中可以表示八進位制和十六進製制。八進位制以0打頭,十六進製制以0x打頭。例如 a 010 八進位制 b 0x10 十六進製制 為了不跟八進位制的數字混淆,數...