精通學習C語言 操作符 2

2021-10-04 13:27:48 字數 1625 閱讀 7462

表示式求值

表示式求值的順序一部分是由操作符的優先順序和結合性決定,同樣,有些表示式的運算元在求值的過程中可能需要轉換為其他型別。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 反...