C與指標 4 6章

2021-08-10 18:11:04 字數 3009 閱讀 2902

第四章語句

由於c不具備布林型別,所以語句在測試值時用的都是整型表示式

4.2  表示式語句

像下面的語句就是完全合法的

y+3;

getchar();

當這些語句被執行時,表示式被求值。但它們的結果不被儲存在任何地方,因為它們沒有使用賦值識別符號,第一條不具備任何效果,第二條則讀取輸入中的下乙個字元,接著就將其丟棄

4.6 for語句

for迴圈有乙個風格上的優勢,它把所有操縱迴圈的表示式收集在一起,便於尋找

4.8 switch

每個case標籤必須具有乙個唯一的值,常量表示式是指在編譯期間進行求值的表示式,它不能是任何變數

case標籤並不把語句劃分成幾個部分,它們只是確定語句列表的進入點

在switch語句裡,

continue

語句沒有任何效果

每個swtich語句只能出現乙個

default

子句,但是,

它可以出現在語句列表的任何位置

4.10

在while和

do迴圈裡,下一次迴圈開始的位置是表示式測試部分,但在

for迴圈裡,下一次迴圈開始的位置是調整部分

第5章 操作符和表示式

5.1 算術操作符

注意類似這種形式的移位:

a<<-5

這類移位的行為是未定義的,所以是由編譯器決定的。應該避免使用這種型別的移位,因為它們的效果是不可**的。使用這類移位的程式是不可移植的

賦值表示式的值就是左運算元的新值,它可以作為其它賦值操作符的運算元,如下:

a=x=y+1;

~對整數型別的運算元進行求補操作,運算元中所有原先為

1的位變為

0,原先為

0的位變為1

(++ ,

---)字首和字尾形式的增值操作符都複製變數值的拷貝,用於周圍表示式的值正是這份拷貝

字首操作符在進行複製之前增加變數的值,字尾操作符在進行複製之後增加變數的值 這些

操作符的結果不是被它們修改的變數,而是變數值的拷貝。它解釋了為什麼不能像下面這樣使用操作符

++a=10;

++a的結果是

a值的拷貝,而不是變數本身,你無法向乙個值進行賦值。

5.2 布林值

c不具備顯式的布林型別,所以使用整數來代替

避免混合使用整型值和布林值,如果乙個變數包含了乙個任意的整型值,應該顯式地對它進行測試:

if(value != 0)  .....

如果乙個變數用於表示布林值,應該始終把它設定為0或

1,例如:

positive_cash_flow=cash_balance>=0;

5.3 左值和右值

例:b+25=a;

當計算機計算b+25時,其結果必然儲存在某個地方,但程式設計師沒辦法**結果會存在哪個地方,也無法保證下次表示式的值還會在這個位置。因此,這個表示式不是乙個左值,基於同樣的理由,字面值常量也都不是左值

5.4 表示式求值

5.4.2算術轉換

如果某個操作符的各個運算元屬於不同的型別,那麼除非其中乙個運算元轉換成另乙個運算元的型別,否則操作就無法執行

警告:當整型值轉換成float型,

float

型僅要求

6位數字的精度,如果將乙個超過

6位數字的整型值賦值給

float

型,結果可能只是該整型值得近似值;

當float型轉換成整型值,小數部分被捨棄(並不四捨五入)。如果浮點數的值過於龐大,無法容納在整型值中,那麼其結果是未定義的。

5.4.3 操作符的屬性

左值意味著乙個位置,右值意味著乙個值。所以,在使用右值的地方可以使用左值,在使用左值的地方不能使用右值。

5.4.4 優先順序和求值的順序

兩個相鄰操作符的執行順序由它們的優先順序決定。如果它們的優先順序相同,它們的執行順序由它們的結合性決定。除此以外,編譯器可以自由決定使用任何順序對表示式求值。

例:a()+b()+c();

如果順序會導致結果產生區別,最好使用臨時變數。

5.5 總結

除%外,(

+-*/

)不僅可以作用於整型,還可以作用於

float型。

位運算子都要求運算元為整數

表示式的結果如果依賴於求值的順序,那麼它在本質上就是不可移植的,應該避免使用。

第6章 指標

6.1 記憶體和位址

名字和記憶體位址之間的關聯並不是硬體提供的,它是由編譯器實現的

6.2 值和型別

不能簡單地通過檢查乙個值得位來判斷它的型別。為了判斷值的型別,必須觀察程式中這個值的使用方式。型別是通過值的使用方法隱性地確定的

6.4 間接訪問操作符

通過乙個指標訪問它所指向的位址的過程稱為間接訪問或解引用指標

6.5 未初始化和非法的指標

如果指標變數是靜態的,它會被初始化為0;但如果變數是自動的,它不會被初始化。無論是哪種情況,宣告乙個指向整型的指標不會「建立」儲存整型值的記憶體空間。

在對指標進行間接訪問之前,必須確保它們已被初始化。

6.7 指標,間接訪問和左值

指標變數可以作為左值,並不是因為它們是指標,而是因為它們是變數。

6.9 指標常量

間接訪問操作只能作用於指標型別表示式

6.10 指標的指標

int a=12;

int *b=&a;

int *c=&b;

6.13指標運算

只有當兩個指標指向同一陣列中的元素時,才允許從乙個指標減去另乙個指標

如果當兩個指標指向的不是同一陣列中的元素時,它們相減的結果是未定義的

可以在任意兩指標間執行相等或不相等測試

6.14總結

對未初始化的指標變數執行間接訪問操作是非法的,而且這種錯誤常常難以檢測。

其結果常常是乙個不相干的值被修改。

對null指標執行間接訪問控制的後果因編譯器而異。兩個常見的後果就是返回記憶體位置零的值和終止程式。

指標運算只有作用在陣列中其結果才是可以**的

C與指標 10 12章

第10章 結構和聯合 10.1 結構宣告 struct x struct y 20 z 警告 這兩個宣告被編譯器當成兩個截然不同的型別,即使它們的成員列表完全相同。因此,y和 z的型別和 x的型別不同,所以下面的語句 z x 是非法的 如果想在多個檔案中使用同一種型別的結構,應該把標籤宣告或type...

C語言第46課指標與陣列實現逆序

指標的位址佔4個位元組 include include intmain int i int ptr array array 賦值完畢後,就可以使用是真訪問陣列元素了 for i 0 i 5 i return0 第1個元素的值為15 位址為 0060fef4 第2個元素的值為20 位址為 0060fe...

C與指標 第七章 函式

1 int func 這個宣告必須被解釋為舊式風格的宣告 只給出 func函式的返回型別 目的是保持與 ansi 標準之前的程式的相容性。乙個沒有引數的函式的原型應該寫成這樣 int func void 關鍵字 void 提示沒有任何引數,而不是表示它有乙個型別為 void 的引數。2 函式的引數是...