C 程式設計基礎(2)變數

2021-09-20 08:13:05 字數 3334 閱讀 9370

(1)c++變數命名只能包含字母、數字、下劃線,其中開頭不能是數字;大小寫敏感;習慣上變數用小寫字母,常量、巨集定義用大寫字母。

(2)變數的作用域分為區域性變數(函式內部定義),全域性變數(函式外部定義)。

(3)關鍵字extern:在標頭檔案總宣告變數,並在前面加上extern,在原始檔中定義變數,其他檔案使用#include匯入標頭檔案,即可使用該變數。附詳細鏈結

1

2extern

intage;3//

test.cpp

4 #include"

test.h"5

int age = 10

;  //直接使用age=10是不行的6//

test1.cpp

7 #include"

test.h"8

int main(int argc, char *ar**)

1314

/*output

1510

16*/

(4)關鍵字static:靜態變數,首次執行時初始化,其後再執行將不再進行初始化,雖然可能是區域性變數,但其生命週期是整個程式執行過程。

(5)關鍵字const:常量型變數,在標頭檔案中直接定義和宣告(不同於一般全域性變數),其他檔案通過#include使用(多個檔案引用不會造成重複定義),如果在原始檔中定義,則其作用域值是本原始檔。

寫出下面**執行後i,j,m,n的值

1

int i=10,j=10;2

int m=(i++)+(i++)+(i++);

3int n=(++j)+(++j)+(++j);

知識點:++i是先自身加一,然後再參與賦值運算,i++是先參與賦值運算,然後再自身加一。

本題的特殊之處是不同的編譯器會產生不同的結果,在vc編譯器中,全部會先完成三個++j,然後再做加法運算,而在gcc編譯器中當有兩個運算元時就會進行加法運算。故結果如下:

1

#vc編譯器

2 i=13,j=13,m=30,n=39;//

13+13+13=39

3#gcc編譯器

4 i=13,j=13,m30,n=37; //

12+12+13=37

在c語言中型別轉換只需要通過變數前面加上變數型別,並且轉換是雙向的,這種方式對於簡單型別可以,複雜資料型別就力不從心了。

c++提供了四種型別轉換操作符:static_cast,dynamic_cast,const_cast,reinterpret_cast。

(1)static_cast可以完全替代c風格型別轉換實現基本型別轉換;

1

int i = 1;2

double d = 1.5;3

int d2i = static_cast(d);

4double i2d = static_cast(i);

同時相關類(如父子關係)可以完成轉換,但是如果父類指標本身指向父類物件,不存在安全問題,如果父類指標本身指向子類物件,則不存在安全問題;

1

class

base {};

2class derived:public

base{};

3 base *b1 = new base; //

父類指標指向父類物件

4 base *b2 = new derived; //

父類指標指向子類物件

5 derived *b2d1 = static_cast(b1); //

轉換成功(不安全)

6 derived *b2d2 = static_cast(b2); //

轉換成功(安全)

(2)dynamic_cast:只能進行物件指標之間的轉;轉換結果可以使指標也可以是引用;轉換時會進行型別檢查(static_cast不會進行檢查);只有當父類指標指向乙個子類物件,並且父類中包含了虛函式,轉換才會成功,否則返回空指標,引用的話丟擲異常。

1

class base ; };

2class drived : public

base{};

3 base *b1 = new

base;

4 base *b2 = new drived;//

父類指標指向子類物件,且父類中包含虛函式5//

轉換結果為指標

6 drived *b2d1 = dynamic_cast(b1);//

轉換失敗(返回null)

7 drived *b2d2 = dynamic_cast(b2);//

轉換成功8//

轉換結果為引用

9 drived &b2d3 = dynamic_cast(*b1);//

轉換失敗(丟擲異常)

10 drived &b2d4 = dynamic_cast(*b2);//

轉換成功

(3)const_cast:可以在轉換過程中增加或刪除const屬性。一般情況下,無法將常量指標直接賦值給普通指標,但通過const_cast可以移除常量指標的const屬性,從而實現const指標到非const指標的轉換。

1

class

test{};

2const test *t1 = new

test;

3 test *t2 = const_cast(t1);

(4)reinterpret_cast:可以將一種型別的指標直接轉換成另一種型別的指標,無論兩個型別之間是否有繼承關係。此外還可以吧乙個指標轉換為乙個整數,也可以把乙個整數轉換成乙個指標。另外還經常用在不同函式指標之間的轉換。

1

class

a{};

2class

b{};

3 a *a = new

a;4 b *b = reinterpret_cast(a); //

轉換成功

(1)在全域性變數前面加上static關鍵字就成為的靜態全域性變數。

(2)靜態全域性變數通常在原始檔中宣告定義,作用域為本檔案,(而全域性變數一般標頭檔案宣告,原始檔定義,通過extern關鍵字,其作用域為整個工程。)

(3)如果在標頭檔案中宣告了靜態全域性變數,那麼即使在沒有初始化的情況下,也會被初始化為預設值,即相當於也被定義了,這時其他檔案#include該標頭檔案,相當於拷貝了乙份,其初始值相同,後面各個檔案中將互相不影響。

下面是靜態全域性變數的乙個例子:

1

static

int sgn;//

宣告定義靜態全域性變數

2void increasesg()

3int

main()

c 基礎 c 簡單程式設計(2)

一 資料的輸入和輸出 1.io流 cin cout 插入運算子 比如 cout 表示式 表示式 提取運算子 比如 cin 表示式 表示式 2.io流類庫操縱符 二 迴圈語句 一 if語句 1.if 表示式 表示式 2.if 表示式 表示式1 else 表示式2 3.if 表示式 表示式1 else ...

C 基礎 變數與常量(2)

一 列舉型別 列舉型別是一種獨特的值型別,它用於宣告一組具有相同性質的常量。編寫與日期相關的應用程式時,經常需要使用年 月 日 星期等日期資料,可以將這些資料組織成多個不同名稱的列舉型別。使用列舉型別可以增加程式的可讀性和可維護性。同時,列舉可以避免型別錯誤。1 在c 中使用關鍵字 enum 類宣告...

《C程式語言》 變數的儲存2

從變數值存在的時間 生存期 劃分 靜態儲存方式 程式執行期間由系統分配固定的儲存空間的方式 動態儲存方式 程式執行期間根據需要進行動態的分配儲存空間的方式 記憶體中供使用者使用的儲存空間的分配 1.程式區 2.靜態儲存區 3.動態儲存區 資料分別放在靜態儲存區 和 動態儲存區 全域性變數 全部放在靜...