操作符和表达式的问题总结
操作符:
- 算術(shù)操作符 + - * / %
%操作符的兩個操作數(shù)必須為整數(shù)
- 移位操作符
<< 左移操作符
>> 右移操作符:邏輯移位(左邊?0填充)、算術(shù)移位(左邊?原該值的符號位填充)
注意:對于移位運(yùn)算符,不要移動負(fù)數(shù)位,這個是標(biāo)準(zhǔn)未定義的
- 位操作符
& 按位與 | 按位或 ^ 按位異或
注:他們的操作數(shù)必須是整數(shù)
- 賦值操作符 = :復(fù)合賦值符 += -+ *= >>= <<= &= |=
- 單?操作符
! 邏輯反操作
- 負(fù)值
+ 正值
& 取地址
sizeof 操作數(shù)的類型?度(以字節(jié)為單位)
~ 對?個數(shù)的?進(jìn)制按位取反
-- 前置、后置--
++ 前置、后置++
* 間接訪問操作符(解引?操作符)
(類型) 強(qiáng)制類型轉(zhuǎn)換
- 關(guān)系操作符? ? > >= < <= != ==
- 邏輯操作符? ? && 邏輯與 | | 邏輯或
&&的特性:若&&前面已經(jīng)為0(假),就沒有必要進(jìn)行后面的運(yùn)算
| | 的特性:若||前面遇到0,則繼續(xù);若遇到非0,就停下
- 條件操作符? ? exp1 ? exp2 : exp3
- 逗號表達(dá)式? ? exp1, exp2, exp3, …expN
逗號表達(dá)式,就是?逗號隔開的多個表達(dá)式。
逗號表達(dá)式,從左向右依次執(zhí)?。整個表達(dá)式的結(jié)果是最后?個表達(dá)式的結(jié)果。
- 下標(biāo)引?[ ]、函數(shù)調(diào)?( )和結(jié)構(gòu)成員./->
?
表達(dá)式求值
隱式類型轉(zhuǎn)換
C的整型算術(shù)運(yùn)算總是?少以缺省整型類型的精度來進(jìn)?的。
整型提升:表達(dá)式中的字符和短整型操作數(shù)在使?之前被轉(zhuǎn)換為普通整型。
char a,b,c; a = b + c;b和c的值被提升為普通整型,然后再執(zhí)?加法運(yùn)算。加法運(yùn)算完成之后,結(jié)果將被截斷,然后再存儲于a中。
char a,b; a = (~a ^ b << 1)>> 1;由于存在求補(bǔ)和左移操作,所以8位的精度是不夠的。標(biāo)準(zhǔn)要求進(jìn)?完整的整型求值,所以對于這類表達(dá)式的結(jié)果,不會存在歧義.
?
算術(shù)轉(zhuǎn)換
如果某個操作符的各個操作數(shù)屬于不同的類型,那么除?其中?個操作數(shù)的轉(zhuǎn)換為另?個操作數(shù)的類型,否則操作就?法進(jìn)?。
尋常算術(shù)轉(zhuǎn)換:
- long double
- double
- float
- unsigned long int
- long int
- unsigned int
- int
如果某個操作數(shù)的類型在上?這個列表中排名較低,那么?先要轉(zhuǎn)換為另外?個操作數(shù)的類型后執(zhí)?運(yùn)算。
float f = 3.14; int num = f;//隱式轉(zhuǎn)換,會有精度丟失上面的例子可以看出:算術(shù)轉(zhuǎn)換要合理,要不然會有?些潛在的問題。
?
操作符的屬性
復(fù)雜表達(dá)式的求值:
- 操作符的優(yōu)先級
- 操作符的結(jié)合性
- 是否控制求值順序
兩個相鄰的操作符先執(zhí)?哪個?取決于他們的優(yōu)先級。如果優(yōu)先級相同,取決于他們的結(jié)合性。
?
來看看一些問題表達(dá)式:
//表達(dá)式一 a*b + c*d + e*f;表達(dá)式一:由于 * 比 + 的優(yōu)先級高,只能保證第一個 * 比第一個 + 計算的早,但優(yōu)先級并不能保證第三個 * 比第一個 + 執(zhí)行的早。
//表達(dá)式二 c + --c;表達(dá)式二:操作符的優(yōu)先級只能決定?減 -- 的運(yùn)算在 + 的運(yùn)算的前?,但是我們并沒有辦法得知 + 操作符的左操作數(shù)的獲取在右操作數(shù)之前還是之后求值,所以結(jié)果是不可預(yù)測的,有歧義。
//表達(dá)式三 int main() {int i = 10;i = i-- - --i * ( i = -3 ) * i++ + ++i;printf("i = %d\n", i); return 0; }表達(dá)式三:是一個非法表達(dá)式,在不同編譯器中有不同的結(jié)果。
//表達(dá)式四 int fun() {static int count = 1;return ++count; } int main() {int answer;answer = fun() - fun() * fun();printf("%d\n", answer);//輸出多少?return 0; }總結(jié):不要寫出依賴求值順序的表達(dá)式。這樣的表達(dá)式是不可移植的。一定要避免。
總結(jié)
以上是生活随笔為你收集整理的操作符和表达式的问题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux——进程间关系和守护进程(总结
- 下一篇: 标识符的链接属性