表示式求值
表示式求值的順序一部分是由操作符的優先順序和結合性決定,同樣,有些表示式的運算元在求值的過程中可能需要轉換為其他型別。c的整形算術運算總是至少以預設整形型別的精度來進行的,為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整形,這種轉換稱為整形提公升。
整形提公升的意義:
表示式的整形運算要在cpu的相應運算器件內執行,cpu內整形運算器(alu)的運算元的位元組長度一般就是int的位元組長度,同時也是cpu的通用暫存器的長度。因此,即使兩個char型別的相加,在cpu執行時實際上也要先轉換為cpu內整形運算元的標準長度。通用cpu是難以直接實現兩個8位元位元組直接相加運算,所以,表示式中各種長度可能小於int長度的整形值,都必須先轉換為int或unsigned int,然後才能送入cpu去執行運算。
//整形提公升是按照變數的資料型別的符號位來提公升的
//負數的整形提公升
char c1 =-1
;變數c1的二進位制位(補碼)中只有8個位元位:
11111111
因為char為有符號的char
所以整形提公升的時候,高位補充符號位,即為1
提公升之後的結果是:
111111111111111111111111111111111
//正數的整形提公升
char c2 =1;
變數c2的二進位制位(補碼)中只有8個位元位
00000001
因為char為有符號的char
所以整形提公升的時候,高位補充符號位,即為0
000000000000000000000000000000001
//無符號整形提公升,高位補0
算術轉換
如果某個操作符的各個運算元屬於不同的型別,那麼除非其中乙個運算元的轉換為另乙個運算元的型別,否則操作就無法進行。下面的層次體系稱為尋常算術轉換
long
double
double
float
unsigned long
intlong
intunsigned int
int//如果某個運算元的型別在上面這個列表中排名較低,那麼首先要轉換為另外乙個運算元的型別後執行運算
//算術轉換要合理,不然會存在一定的潛在問題
操作符的屬性
複雜表示式的求值有三個影響的因素
操作符的優先順序
操作符的結合性
是否控制求值順序
兩個相鄰的操作符先執行哪個?取決於他們的優先順序,如果兩者的優先順序相同,取決於他們的結合性。
//表示式1
a*b + c*d + e*f;
//表示式1中*的優先順序比+高,但是只能保證*的計算比+早,不能通過優先順序確定第三個*比第乙個+早
//表示式2
c +--c;
//同樣,操作符的優先順序只能決定自減--的運算在+的運算的前面,但是我們並沒有辦法得知,+操作符的左運算元的獲取在右運算元之前還是之後求值,所以結果是不可**的,是有歧義的。
//...
我們寫出的表示式如果不能通過操作符的屬性確定唯一的計算路徑,那這個表示式就是存在問題的。 精通學習C語言 結構體
結構體的宣告 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。結構體的宣告,語法如下 struct tag variable list 例如描述乙個學生 typedef struct stu stu 結構體的成員型別可以是標量 陣列 指標,甚至是其他結構體。結構體變數的定...
c語言操作符 位操作符 移位操作符
1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...
C語言操作符學習總結
操作符分類 除法 如果兩個運算元為整數,執行整數除法,只要有浮點型就執行浮點數除法。模 只能對整數進行 兩個數都為整數 左移 exp int a 10 b a 1 a 10 b 20 右移 exp int a 10 1 原碼 10000000 00000000 00000000 00000001 反...