《C和指標》 第四章 語句 操作符和表示式

2021-09-28 14:37:40 字數 2937 閱讀 8541

c最簡單的語句就是空語句,它本身只包含乙個分號。並不執行任何任務。

就是位於一對花括號之內的可選的宣告和語句列表。

c並不具備布林值型別,而是用整型來代替。這樣零值表示假,非零值表示真。

另外。else子句從屬於最靠近他的不完整的if語句。所以,請注意語法要求,及時用花括號將語句分開。

在while迴圈中,可以使用break語句,用於永久結束迴圈。在執行完break語句之後,執行流下一條執行的語句就是迴圈正常結束後應該執行的那條語句。

在while中,也可以使用continue語句,用於永久結束當前的那次迴圈。在執行完continue之後,執行流接下來就是從新測試表示式的值,決定是否繼續執行迴圈。

這兩個語句只對最內層的迴圈起作用,不影響外部的迴圈。

每乙個case標籤必須具有乙個唯一的值。常量表示式是指編譯期間進行求值的表示式,他不能是任何變數。這裡不同尋常之處是case檔案標籤並不能把語句列表劃分為幾個部分,他們只是確定語句列表的進入點。

除了%操作符,其餘幾個既適用於浮點型別又適用於整數型別。

移位操作只是簡單地把乙個值的位向左或者向右移動。在左移位中,值最左邊的幾位被丟棄,右邊多出來的幾個空位由0補齊。

右移位操作存在乙個左移位操作不曾存在的問題:從左邊移入新位時,可以選擇兩種方案。一種是邏輯移位,左邊移入的位用0填充;另一種是算術移位,左邊移入的位由原先該值的符號位決定,符號位為1則移入的位均為1,符號位為0則移入的均為0;這樣能保持原數的正負形式不變。

左移位操作符為<<,右移位操作符為》。左運算元的值將移動由右操作符指定的位數。兩個運算元都必須是整型型別。

注:對於有符號值,到底是採用邏輯移位還是算術移位取決於編譯器。

位操作符有 & |  ^,分別執行,與,或,異或。

他們要求操作符為整數型別,他們對運算元對應的位進行指定的操作,每次對左右運算元的各一位進行操作。

舉例說明:假定變數a的二進位制為00101110,變數b的二進位制值為01011011,a&b的結果為00001010,a | b的結果為01111111,a^b結果為011110101。

下面的表示式顯示了你可以怎樣使用移位操作符位操作符來操縱乙個整型值中的單個位。表示式假定bit_number為乙個整型值,它的範圍是從0至整型值的位數減1,並且整型值的位從右向左計數。第乙個例子把指定的位設定成1.

value = value | 1<< bit_number;

下乙個例子把指定的位清0。

value = value & ~( 1 << bit_number);

這些表示式常常寫成|=和&=操作符的形式。

最後,下面這個表示式對指定的位進行測試,如果該位已被設定為1,則表示式的結果為非零值。

value & 1 << bit_number;

在下面的語句中,認為x和a被賦予相同的值的說法是不正確的,

a = x = y + 3;

如果x是乙個字元型變數,那麼y + 3的值就會被截去一段,以便於容納字元型別的變數中。那麼a所賦的值就是這個被截斷後的值,在下面這個常見的錯誤中,這種截短正是問題的根據所在:

char ch;

....

while ( (ch = getchar() ) != eof )...

eof需要的位數比字元型值所能提供的位數要多,這也是getchar()返回乙個整型值而不是字元值的原因。然而把getchar的返回值首先儲存於ch中將導致它被截短。

表示式求值順序一部分是由它所包含的操作符的優先順序和結合性決定。同樣,有些表示式的運算元在求值過程中可能需要轉換為其他型別。

1.隱式型別轉換

c的整型算術運算總是至少以預設整型型別的精度來進行的。為了獲得這個精度,表示式中的字元型和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提公升。

例如,在下面的表示式的求值中,

char a, b, c ;

a = b + c;

b和c的值被提公升為普通整型,然後在執行加法運算。加法運算的結果將被截短,然後在儲存於字元a中。這個例子的結果和使用8位算術的結果是一樣的。但是在下面這個例子中,他的結果就不再相同。這個例子用於計算一系列字元的簡單檢驗和。

a = ( ~a ^ b << 1 ) >> 1;
由於存在求補和左移操作,所以8位的精度是不夠的。標準要求進行完整的整型求值,所以對於這類表示式的結果,不會存在歧義性。

2.算術轉換

如果某個操作符的各個運算元屬於不同的型別,那麼除非其中乙個運算元轉換為另乙個運算元的型別,否則操作就無法進行。下面的層次體系稱為尋常算術轉換

long double

double

float

unsigned long int

long int

unsigned int

int

如果某個運算元的型別在上面這個表中排名較低,那麼他首先將轉換為另乙個運算元的型別然後進行操作。

例子:

int a =5000;

int b = 25;

long c = a * b;

例子的問題在於ab是以整型進行計算,在32位的機器上,這段**執行起來沒有問題,但是在16位整數的機器上,這個乘法運算會產生溢位,這樣c就會被初始化為錯誤的值。

解決方案是在執行乘法之前,將其中乙個運算元轉換為長整型。

long c = (long)a * b;
當整型值轉換為float型值時,也有可能損失精度。float型值僅要求6位數字的精度。如果將乙個超過6位數字的整型值賦值給乙個float型變數時,其結果可能只是該整形值的近似值。

當float型值轉換為整型值時,小數部分被捨棄,如果浮點數的值過於龐大,無法容納於整型值中,那麼其結果將是未定義的。

第四章 陣列和指標

由於陣列和指標這部分知識比較深奧,本菜鳥決定將c和c 的指標部分的知識點全歸到c語言部分來整理,所以這裡就只總結一些題目。下列陣列的值是什麼?string sa 10 int ia 10 int main 解答 sa 和sa2 為元素型別為string 的陣列,自動呼叫string 類的預設建構函式...

第四章 陣列和指標

4.1 陣列 1 陣列的初始化 在函式體外定義的內建陣列,都初始化為0 在函式體內的內建陣列,均無初始化 顯示顯示初始化則可不必制定陣列的維數 初始化如果元素為類型別,則自動的條用該類預設的建構函式 2 特殊字元陣列 char ca c 會自動的在c 後新增乙個空的字元 o 而char ca2 ca...

第四章 陣列和指標

陣列 首先陣列的初始化不允許直接複製和賦值,陣列的元素的型別是size t型別,可以通過for size t ix 0 ix!array size ix 指標 指標的定義 int p 注意 在使用指標之前必須要初始化指標。並且對指標初始化的值應該使用如下四種值 1 0值常量表示式。例如和疑惑的0值得...