P5.運(yùn)算符
運(yùn)算符介紹:
運(yùn)算符是一種特殊的符號(hào),用以表示數(shù)據(jù)的運(yùn)算、賦值和比較等。?
1) 算術(shù)運(yùn)算符 (+, -, * , / , %)?
2) 賦值運(yùn)算符 (= += -= ..)?
3) 關(guān)系運(yùn)算符(比較運(yùn)算符)(比如 > >= < <= == 等等)?
4) 邏輯運(yùn)算符 (&& 邏輯與 || 邏輯或 ! 邏輯非)?
5) 位運(yùn)算符 (& 按位與 | 按位或 ^ 按位異或 ~ 按位取反等等)?
6) 三元運(yùn)算符 ( 表達(dá)式 ? 表達(dá)1 : 表達(dá)2)
算術(shù)運(yùn)算符:
介紹:算術(shù)運(yùn)算符是對(duì)數(shù)值類型的變量進(jìn)行運(yùn)算的,在C程序中使用的非常多。

案例演示:案例演示算術(shù)運(yùn)算符的使用(operator.c)。?
1) +, - , * , / , %, ++, -- , 重點(diǎn)講解 /、%、++?
2) 自增:++ 作為獨(dú)立的語句使用: 前++和后++都完全等價(jià)于 i=i+1; 作為表達(dá)式使用 前++:++i先自增后賦值 后++:i++先賦值后自增?
3) -- ,+、-、* 是一個(gè)道理,完全可以類推。
細(xì)節(jié)說明:
1) 對(duì)于除號(hào)“/”,它的整數(shù)除和小數(shù)除是有區(qū)別的:整數(shù)之間做除法時(shí),只保留整數(shù) 部分而舍棄小數(shù)部分。 例如:int x= 10/3 ,結(jié)果是 3?
2) 當(dāng)對(duì)一個(gè)數(shù)取模時(shí),可以等價(jià) a%b=a-a/b*b , 這樣我們可以看到 取模的一個(gè)本質(zhì) 運(yùn)算。 3) 當(dāng) 自增 當(dāng)做一個(gè)獨(dú)立語言使用時(shí),不管是 ++i; 還是 i++; 都是一樣的,等價(jià)?
4) 當(dāng) 自增 當(dāng)做一個(gè) 表達(dá)式使用時(shí) j = ++i 等價(jià) i = i + 1; j = i;?
5) 當(dāng) 自增 當(dāng)做一個(gè) 表達(dá)式使用時(shí) j = i++ 等價(jià) j = i; i = i + 1;

自增,自減課堂練習(xí):
void main() {?
int i1 = 10, i2 = 20;?
int i = i1++;//i =10, i1=11?
printf("i=%d\n",i);// 10?
printf("i1=%d\n", i1);//11?
i = ++i1;?
printf("i=%d\n", i);//12?
printf("i1=%d\n", i1);//12?
i = i2--;?
printf("i=%d\n",i);// 20?
printf("i2=%d\n",i2);//19?
i = --i2;?
printf("i=%d\n", i);//18?
printf("i2=%d\n", i2);//18?
getchar();?
}
輸出結(jié)果:?
i= 10 i1= 11 ?
i= 12 i1= 12?
i= 20 i2= 19?
i= 18 i2= 18

課堂練習(xí)2:
1) 假如還有97天放假,問:xx個(gè)星期零xx天?
2) 定義一個(gè)變量保存華氏溫度,華氏溫度轉(zhuǎn)換攝氏溫度的公式為:5/9*(華氏 溫度-100),請(qǐng)求出華氏溫度對(duì)應(yīng)的攝氏溫度。


我的源碼:
/*
練習(xí)要求:
1.假如還有99天放假,問:還有xx個(gè)星期零xx天
2.定義一個(gè)變量保存華氏溫度,華氏溫度轉(zhuǎn)攝氏溫度的公式:5/9 * (華氏溫度-100),請(qǐng)求出華氏溫度對(duì)應(yīng)的攝氏溫度。
*/
#include <stdio.h>
void main(){
//1思路:
//1.定義一個(gè)變量 days 保存天數(shù)
//2.定義一個(gè)變量 week 保存計(jì)算得到的星期
//3.定義一個(gè)變量 leftDays 保存剩余天數(shù)
//4.要使用 % 和 / 來計(jì)算
short days = 99;
short week = days / 7;
short leftDays = days % 7;
//2思路略過
double huaShi = 13;
double sheShi = 5.0 / 9 * (huaShi - 100);// 5.0/9,不然輸出都是0(5/9等于0)
printf("還有%d個(gè)星期零%d天放假\n",week,leftDays);
printf("華氏溫度%.3f轉(zhuǎn)為攝氏溫度是%.3f\n",huaShi,sheShi);
getchar();
}

關(guān)系運(yùn)算符(比較運(yùn)算符)?
介紹:
1) 關(guān)系運(yùn)算符的結(jié)果 要么是真(非0 表示),要么是 假(0 表示)?
2) 關(guān)系表達(dá)式 經(jīng)常用在 if結(jié)構(gòu)的條件中或循環(huán)結(jié)構(gòu)的條件中

細(xì)節(jié)說明:
1) 關(guān)系運(yùn)算符的結(jié)果要么是真(非0 表示, 默認(rèn)使用1),要么是 假(0 表示) ?
2) 關(guān)系運(yùn)算符組成的表達(dá)式,我們稱為關(guān)系表達(dá)式。 a > b ?
3) 比較運(yùn)算符 "=="(關(guān)系運(yùn)算符) 不能誤寫成 "=" (賦值)

我的源碼:
/*
關(guān)系運(yùn)算符 也叫 比較運(yùn)算符
1.關(guān)系運(yùn)算符的結(jié)果 要么是真(非0表示,默認(rèn)使用1表示),要么是假(用0表示)
2.關(guān)系運(yùn)算符組成的表達(dá)式,我們稱為關(guān)系表達(dá)式。如 a > b
3.比較運(yùn)算符 ==(關(guān)系運(yùn)算符) 不能寫成 =(賦值)
*/
#include <stdio.h>
void main(){
int a = 13;
int b = 3;
printf("關(guān)系表達(dá)式 a>b 的值是%d\n",a > b);//1
printf("關(guān)系表達(dá)式 a>=b 的值是%d\n",a >= b);//1
printf("關(guān)系表達(dá)式 a<b 的值是%d\n",a < b);//0
printf("關(guān)系表達(dá)式 a<=b 的值是%d\n",a <= b);//0
printf("關(guān)系表達(dá)式 a==b 的值是%d\n",a == b);//0
printf("關(guān)系表達(dá)式 a!=b 的值是%d\n",a != b);//1
getchar();
}

邏輯運(yùn)算符:
介紹:用于連接多個(gè)條件(一般來講就是關(guān)系表達(dá)式),最終的結(jié)果要么是真(非0 ?表示),要么是 假(0 表示) 。





練習(xí)題2:請(qǐng)寫輸出結(jié)果?
void main() {?
int x=1;?
int y=0;?
short z=42;?
if((z++==42)&&(y=1)) {?// z = 43 , y =1?
z++; // z = 44?
????}?
if((x=0) || (++z==45)) { // z = 45?
z++; // z = 46?
????}?
printf("z=%d", z); // z 為46?
getchar();?
} 結(jié)果為:z 為 46

我的源碼:
/*
邏輯運(yùn)算符 (&& || !三個(gè))
用于連接多個(gè)條件(一般來講就是關(guān)系表達(dá)式),最終結(jié)果要么是真(非0表示),要么是假(0表示)
*/
#include <stdio.h>
void main(){
//int a = 10,b=99;
//if(a<20 && b++>100){
// printf("OK100");//不會(huì)輸出
//}
//printf("b=%d\n",b);//輸出b=100
//int a = 10,b=99;
//if(a<2 && ++b>99){
// printf("OK100\n");//也不會(huì)輸出
//}
//printf("b=%d\n",b);//輸出b=99
//1.在就行 && 操作時(shí),如果第一個(gè)條件為false,則后面的條件不再判斷,整個(gè)結(jié)果為false
//2.該現(xiàn)象稱為 短路現(xiàn)象,所以邏輯與 也稱為 短路邏輯與
//int a = 10,b=99;
//if(a<5 || b++>100){
// printf("@@@OK100@@@\n");//不會(huì)輸出
//}
//printf("b=%d\n",b);//輸出b=100
//int a = 10,b=99;
//if(a>5 || b++>100){
// printf("@@@OK100@@@\n");//輸出@@@OK100@@@
//}
//printf("b=%d\n",b);//輸出b=99
//1.在就行 || 操作時(shí),如果第一個(gè)條件為true,則后面的條件不再判斷,整個(gè)結(jié)果為真
//2.該現(xiàn)象稱為 短路現(xiàn)象,所以邏輯或 也稱為 短路邏輯或
//邏輯非
int score = 100;
int res = score < 99;//res=0
if(res){
printf("Hello Tom\n");
}
if(!res){
printf("Hello Jack\n");
}
getchar();
}

#include <stdio.h>
void main(){
int x=1;
int y=0;
short z=42;
//下面if語句的 賦值語句寫在前面不需要括號(hào),寫在后面需要括號(hào)。優(yōu)先級(jí)問題
if(z++==42 && (y=1)){//z=43,y=1
z++;//z=44
}
if(x=0 || ++z==45){//x=0為假,z=45
z++;//z=46
}
printf("z=%d\n",z);
getchar();
}

賦值運(yùn)算符:
介紹:賦值運(yùn)算符就是將 某個(gè)運(yùn)算后的值, 賦給指定的變量。 賦值運(yùn)算符一覽表 先講 =、+=、-=、 *= 、/=、%=?
<<=、>>=、&=、^=、 |= 和位運(yùn)算相關(guān),放 在后面講解
運(yùn)算符 ????????描述 ????????實(shí)例?
= 簡單的賦值運(yùn)算符,把右邊操作數(shù)的值賦給左邊操作數(shù) C = A + B 將把 A + B 的值賦給?
+= 加且賦值運(yùn)算符,把右邊操作數(shù)加上左邊操作數(shù)的結(jié)果賦值給左 邊操作數(shù) C += A 相當(dāng)于 C = C + A?
-= 減且賦值運(yùn)算符,把左邊操作數(shù)減去右邊操作數(shù)的結(jié)果賦值給左 邊操作數(shù) C -= A 相當(dāng)于 C = C - A?
*= 乘且賦值運(yùn)算符,把右邊操作數(shù)乘以左邊操作數(shù)的結(jié)果賦值給左 邊操作數(shù) C *= A 相當(dāng)于 C = C * A /= 除且賦值運(yùn)算符,把左邊操作數(shù)除以右邊操作數(shù)的結(jié)果賦值給左 邊操作數(shù) C?
/= A 相當(dāng)于 C = C / A %= 求模且賦值運(yùn)算符,求兩個(gè)操作數(shù)的模賦值給左邊操作數(shù) C %= A 相當(dāng)于 C = C % A?
<<= 左移且賦值運(yùn)算符 C <<= 2 等同于 C = C << 2?
>>= 右移且賦值運(yùn)算符 C >>= 2 等同于 C = C >> 2?
&= 按位與且賦值運(yùn)算符 C &= 2 等同于 C = C & 2?
^= 按位異或且賦值運(yùn)算符 C ^= 2 等同于 C = C ^ 2?
|= 按位或且賦值運(yùn)算符 C |= 2 等同于 C = C | 2

案例演示:
案例演示賦值運(yùn)算符的基本使用。?
1) 賦值基本案例 [int num1 = 10 + 3]?
2) 有兩個(gè)變量,a和b,要求將其進(jìn)行交換,最終打印結(jié)果?
3) += 的使用案例?
賦值運(yùn)算符特點(diǎn):
(1) 運(yùn)算順序從右往左?
(2) 賦值運(yùn)算符的左邊 只能是變量,右邊 可以是變量、表達(dá)式、常量值?
(3) 復(fù)合賦值運(yùn)算符等價(jià)于下面的效果 比如:a+=3;等價(jià)于a=a+3;

我的源碼:
/*
賦值運(yùn)算符:
就是將某個(gè)運(yùn)算后的值,賦給指定的變量
有:= +=... <<=...
簡單略過,
<<= 左移且賦值運(yùn)算符 (c<<=2 等同于 c=c << 2)
>>= 右移且賦值運(yùn)算符
&= 按位與且賦值運(yùn)算符
^= 按位異或且賦值運(yùn)算符
|= 按位或且賦值運(yùn)算符(c |=2 等同于 c = c | 2)
*/
/*
運(yùn)算順序 從右往左
賦值運(yùn)算符 左邊只能是變量,右邊可以是變量,表達(dá)式,常量值
注意:在運(yùn)算時(shí),可能截?cái)嘈?shù)點(diǎn)后面的部分
*/
#include <stdio.h>
void main(){
//int a1 = 10;
//int b1 = 11.1;
//a1+=1.7;
//printf("a1=%d b1=%d\n",a1,b1);//a1=11 b1=11
//有兩個(gè)變量,a和b,要求進(jìn)行交換,打印結(jié)果
int a = 13;
int b = 1313;
int temp = a;
a = b;
b = temp;
printf("a=%d b=%d\n",a,b);//a=1313 b=13
getchar();
}

位運(yùn)算符
介紹:位運(yùn)算符作用于位, 并逐位執(zhí)行操作。 位運(yùn)算符一覽表 要徹底搞懂位運(yùn)算, 需要先學(xué)習(xí)二進(jìn)制, 因此位運(yùn)算,我們 放在二進(jìn)制后講解
運(yùn)算符 ????????描述 ????????實(shí)例?
& 按位與操作,按二進(jìn)制位進(jìn)行"與"運(yùn)算。運(yùn)算規(guī)則: 0&0=0; 0&1=0; 1&0=0; 1&1=1;?
(A & B) 將得到 12,即為 0000 1100?
| 按位或運(yùn)算符,按二進(jìn)制位進(jìn)行"或"運(yùn)算。運(yùn)算規(guī)則: 0|0=0; 0|1=1; 1|0=1; 1|1=1;?
(A | B) 將得到 61,即為 0011 1101?
^ 異或運(yùn)算符,按二進(jìn)制位進(jìn)行"異或"運(yùn)算。運(yùn)算規(guī)則: 0^0=0; 0^1=1; 1^0=1; 1^1=0;?
(A ^ B) 將得到 49,即為 0011 0001?
~ 取反運(yùn)算符,按二進(jìn)制位進(jìn)行"取反"運(yùn)算。運(yùn)算規(guī)則: ~1=0; ~0=1;?
(~A ) 將得到 -61,即為 1100 0011, 一個(gè)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼形式。?
<< 二進(jìn)制左移運(yùn)算符。將一個(gè)運(yùn)算對(duì)象的各二進(jìn)制位 全部左移若干位(左邊的二進(jìn)制位丟棄,右邊補(bǔ)0)。 A << 2 將得到 240,即為 1111 0000?
>> 二進(jìn)制右移運(yùn)算符。將一個(gè)數(shù)的各二進(jìn)制位全部右 移若干位,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1,右邊丟棄。 A >> 2 將得到 15,即為 0000 1111

我的源碼:
/*
進(jìn)制介紹
1.二進(jìn)制:0,1,滿2進(jìn)1,C語言中沒有二進(jìn)制常數(shù)的表示方法。
2.十進(jìn)制:0~9,滿10進(jìn)1。
3.八進(jìn)制:0~7,滿8進(jìn)1。以數(shù)字0開頭。
4.十六進(jìn)制:0~9和A~F,滿16進(jìn)1。以0x或0X開頭表示。此處A~F不區(qū)分大小寫?!続->10,b->11,...f->15】
--0x13bF + 1 ==0x13C0
*/
/*
進(jìn)制轉(zhuǎn)換:
其他進(jìn)制轉(zhuǎn)為十進(jìn)制:0x1dcf==>1*16^3 + d*16^2 + c*16 + f = 7631。其他一樣,位數(shù) * 位權(quán)
十進(jìn)制轉(zhuǎn)為其它進(jìn)制:用短除法,比如十進(jìn)制->十六進(jìn)制【一直除以16,直到商為0,再把余數(shù)倒過來寫】
二進(jìn)制轉(zhuǎn)為8、16進(jìn)制:3位二進(jìn)制對(duì)應(yīng)1wei八進(jìn)制,4位二進(jìn)制對(duì)應(yīng)1位十六進(jìn)制【把它算出來,位*位權(quán) 對(duì)應(yīng) 寫成一個(gè)數(shù)】
11 100 101-->八進(jìn)制--> 3 4 5
11 1001 0110-->十六進(jìn)制--> 3 9 6
八、十六進(jìn)制轉(zhuǎn)為二進(jìn)制:和二進(jìn)制轉(zhuǎn)為8、16進(jìn)制類似,反過來看就行
01230-->二進(jìn)制-->001 010 011 000
0xAB29-->二進(jìn)制-->1010 1011 0010 1001
*/
/*
【原碼、反碼、補(bǔ)碼】
1.二進(jìn)制的最高位是符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)
2.正數(shù)的原碼、反碼、補(bǔ)碼都一樣(三碼合一)
3.負(fù)數(shù)的反碼 = 它的原碼符號(hào)位不變,其它位全部取反(0-->1,1-->0)
4.負(fù)數(shù)的補(bǔ)碼 = 它的反碼 + 1
5.0的反碼,補(bǔ)碼都是0
6.在計(jì)算機(jī)運(yùn)算的時(shí)候,【都是以補(bǔ)碼的方式來運(yùn)算的】。但是最終結(jié)果顯示,需要把補(bǔ)碼轉(zhuǎn)為原碼
*/
/*
【位運(yùn)算當(dāng)然和邏輯運(yùn)算符 不一樣】
按位與(&),規(guī)則:兩邊都為1,才為1【0&0=0,1&1=1,0&1=0,1&0=0】
按位或(|),規(guī)則:兩邊有1為1【0|0=0,1|1=1,0|1=1,1|0=1】
按位異或(^),規(guī)則:兩邊相同為0,不同為1【0^0=0,1^1=0,0^1=1,1^0=1】
按位取反(~),規(guī)則:兩邊取反【~1=0,~0=1】
【最終顯示是原碼,補(bǔ)碼最終都要轉(zhuǎn)為原碼】【一句話補(bǔ)碼計(jì)算,原碼最終顯示】
/*
/*
位運(yùn)算例子:【int有4個(gè)字節(jié),下面是一個(gè)字節(jié)的【懶得補(bǔ)完整】,算出結(jié)果都一樣】
~2 = -3;//二進(jìn)制為 0000 0010 -->反碼 0000 0010 -->補(bǔ)碼 0000 0010 --》對(duì)補(bǔ)碼取反 1111 1101--》還原為原碼 1000 0011--》-3
~-2 = 1;//二進(jìn)制為 1000 0010 -->反碼 1111 1101-->補(bǔ)碼 1111 1110--》對(duì)補(bǔ)碼取反 0000 0001--》還原為原碼 0000 0001--》1
~-5 = 4;//二進(jìn)制為 1000 0101 -->反碼 1111 1010-->補(bǔ)碼 1111 1011--》對(duì)補(bǔ)碼取反 0000 0100--》還原為原碼 0000 0100--》4
2 & -3 = 0;//2的二進(jìn)制為 0000 0010(補(bǔ)碼一樣)。-3的二進(jìn)制為 1000 0011(補(bǔ)碼 1111 1101)--> 0000 0010 & 1111 1101 =》0000 0000-->還原為原碼 0
2 | 3 = 3;//2的二進(jìn)制為 0000 0010(補(bǔ)碼一樣)。3的二進(jìn)制為 0000 0011(補(bǔ)碼一樣)--> 0000 0010 | 0000 0011 =》0000 0011-->還原為原碼(正數(shù)原碼一樣)--》3
2 ^ 3 = 1;//2的二進(jìn)制為 0000 0010(補(bǔ)碼一樣)。3的二進(jìn)制為 0000 0011(補(bǔ)碼一樣)--> 0000 0010 ^ 0000 0011 =》0000 0001-->還原為原碼(正數(shù)原碼一樣)--》1
*/
/*
二進(jìn)制左移(<<),規(guī)則:將二進(jìn)制全部左移若干位【右邊補(bǔ)0,左邊二進(jìn)制位丟棄】
二進(jìn)制右移(>>),規(guī)則:將二進(jìn)制全部右移若干位【(正數(shù)左邊補(bǔ)0,負(fù)數(shù)左邊補(bǔ)1),右邊丟棄】(補(bǔ)0和1 是因?yàn)?,不能改變?shù)的符號(hào))
【位運(yùn)算說明2】
<< 叫算術(shù)左移。規(guī)則:符號(hào)位不變,低位補(bǔ)0
>> 叫算術(shù)右移。規(guī)則:低位溢出,符號(hào)位不變,并用符號(hào)位 補(bǔ)溢出的高位。
*/
/*
例子2://照樣4個(gè)字節(jié),只寫其中的1個(gè)字節(jié)
1 >> 3? // (正數(shù)相當(dāng)于除以3個(gè)2-->1/2/2=0)【左移就是乘3個(gè)2,2是權(quán)重,但是負(fù)數(shù)不能這樣算,因?yàn)樨?fù)數(shù)補(bǔ)碼和原碼不一樣】
int a = 1 >> 2;//1的補(bǔ)碼 0000 0001-->右移2位--> 0000 0000--》0
int b = -1 >> 2;//-1的補(bǔ)碼 1111 1111-->右移2位-->1111 1111-->原碼 1000 0001--》-1
int c = 1 << 3;// 0000 0001-->左移3位--> 0000 1000--》8【相當(dāng)于1*2*2*2=8】
int d = -3 << 3;//-3補(bǔ)碼1111 1101--左移3位-->1110 1000-->原碼 1001 1000 --》-24
~6;
~-7;
13 & 7;
5 | 4;
-3 ^ 3;
*/
//1000 0000 0000 0001
//反碼:1111 1111 1111 1110
//補(bǔ)碼:1111 1111 1111 1111
#include <stdio.h>
int main(){
//int num = 011;
//int num2 = 0X13bf + 1;
//printf("num=%d num2=%d",num,num2);//num=9 num2=5056
int num1 = ~2;//-3
int num2 = ~-2;//1
int num3 = ~-5;//4
int num4 = 2 & -3;//0
int num5 = 2 | 3;//3
int num6 = 2 ^ 3;//1
int a = 1 >> 2;//0
int b = -1 >> 2;//-1
int c = 1 << 3;//8
int d = -3 << 3;//-24
printf("num1=%d num2=%d num3=%d num4=%d num5=%d num6=%d\n",num1,num2,num3,num4,num5,num6);
printf("a=%d b=%d c=%d d=%d",a,b,c,d);
getchar();
}

三元運(yùn)算符
基本語法:條件表達(dá)式 ? 表達(dá)式1: 表達(dá)式2;?
1) 如果條件表達(dá)式為非0 (真),運(yùn)算后的結(jié)果是表達(dá)式1;?
2) 如果條件表達(dá)式為0 (假),運(yùn)算后的結(jié)果是表達(dá)式2;?
3) 口訣: 一燈大師 =》 一真大師?
使用細(xì)節(jié):
1) 表達(dá)式1和表達(dá)式2要為可以賦給接收變量的類型(或可以自動(dòng)轉(zhuǎn)換), 否則 會(huì)有精度損失?
2) 三元運(yùn)算符可以轉(zhuǎn)成if--else 語句?
int res = a > b ? a++ : --b; // if ... else ..?
課堂練習(xí):
案例1:實(shí)現(xiàn)兩個(gè)數(shù)的最大值 (a , b )?
int a = 10;?
int b = 99;?
int res = a > b ? a++ : b--;
案例2:實(shí)現(xiàn)三個(gè)數(shù)的最大值?
int a = 10;?
int b = 100;?
int c = 199;?
int max = a > b ? a : b

運(yùn)算符優(yōu)先級(jí)?
運(yùn)算符優(yōu)先級(jí)小結(jié):?
1) 結(jié)合的方向只有三個(gè)是從右向左,其余都是從左向右?
2) 所有的雙目運(yùn)算符中只有賦值運(yùn)算符的結(jié)合方向是從右向左?
3) 另外兩個(gè)從右向左的結(jié)合運(yùn)算符,一個(gè)是單目運(yùn)算,還有一個(gè)是三目運(yùn)算()?
4) 逗號(hào)的運(yùn)算符優(yōu)先級(jí)最低?
5) 說一下優(yōu)先級(jí)的大概的順序 算術(shù)運(yùn)算符 > 關(guān)系運(yùn)算符 > 邏輯運(yùn)算符(邏輯 非! 除外) > 賦值運(yùn)算符 > 逗號(hào)運(yùn)算符?
6) 注意不需要刻意的記, 常用就慢慢有印象
優(yōu)先級(jí)問題 ????表達(dá)式 ????經(jīng)常誤認(rèn)為的結(jié)果???? 實(shí)際結(jié)果 (紅色標(biāo)注)
. 的優(yōu)先級(jí)高于 *(-> 操作符 用于消除這個(gè)問題)? ?*p.f ?? ?p 所指對(duì)象的字段 f,等價(jià)于: (*p).f?????對(duì) p 取 f 偏移,作為指針, 然后進(jìn)行解除引用操作,等 價(jià)于: *(p.f)?
[] 高于 * ????int *ap[] ????ap 是個(gè)指向 int 數(shù)組的指針, 等價(jià)于: int (*ap)[] ????ap 是個(gè)元素為 組,等價(jià)于: int *(ap [])?
函數(shù)?() 高于 * ????int *fp()???? fp 是個(gè)函數(shù)指針,所指函數(shù) 返回 int,等價(jià)于: int (*fp)() ????fp 是個(gè)函數(shù),返回 價(jià)于: int* ( fp() )?
== 和 != 高于位操作 ????(val & mask != 0) ????(val &mask) != 0 ????val & (mask != 0)?
== 和 != 高于賦值符???? c = getchar() != EOF ????(c = getchar()) != EOF???? c = (getchar() != EOF)?
算術(shù)運(yùn)算符高于位移運(yùn)算符???? msb << 4 + lsb????? (msb << 4) + lsb ????msb << (4 + lsb)?
逗號(hào)運(yùn)算符在所有運(yùn)算符中 優(yōu)先級(jí)最低 ????i = 1, 2??????i = (1,2)??????(i = 1), 2
運(yùn)算符優(yōu)先級(jí)注 意事項(xiàng)和細(xì)節(jié):?
上表中,優(yōu)先級(jí)同 為1 的幾種運(yùn)算符 如果同時(shí)出現(xiàn),那 怎么確定表達(dá)式的 優(yōu)先級(jí)呢?這里我 們專門說明一把
我的源碼:
/*
位運(yùn)算后面講
三元運(yùn)算符,基本語法:
1.如果 條件表達(dá)式 為非0(真),運(yùn)算后的結(jié)果是 表達(dá)式1
2.如果 條件表達(dá)式 為0(假),運(yùn)算后的結(jié)果是 表達(dá)式2
*/
/*
細(xì)節(jié):
1.表達(dá)式1和表達(dá)式2 要為 可以賦給接收變量的類型(或可以自動(dòng)轉(zhuǎn)換),否則會(huì)有精度損失
2.三元運(yùn)算符可以轉(zhuǎn)換為 if-else語句
*/
#include <stdio.h>
void main(){
//int a = 13;
//int b = 1313;
//int c = 131313;
//int max = a > b ? a : b;
//int max2 = (a>b?a:b)>c?(a>b?a:b):c;//建議使用中間變量max寫,簡短一點(diǎn)
//
//printf("兩個(gè)數(shù)的最大值是 %d\n",max);//1313
//
//printf("三個(gè)數(shù)的最大值是 %d\n",max2);//131313
int a =13;
int b = 1313;
int res = a > b ? a++ : b--;
int n1 = a > b? 1.1 : 1.2;//警告:從“double”轉(zhuǎn)換到“int”,可能丟失數(shù)據(jù)
printf("\na=%d b=%d res=%d",a,b,res);//a=13 b=1312 res=1313
getchar();
}
/*
運(yùn)算符優(yōu)先級(jí) (不知道的就查表)
運(yùn)算符優(yōu)先級(jí)小結(jié)
1.結(jié)合方向只有3個(gè)從右向左,其余都是從左往右
2.所有雙目運(yùn)算符(就是兩個(gè)操作數(shù)那種 + - * /...),只有賦值運(yùn)算符是 從右向左
3.另外兩個(gè) 從右向左的運(yùn)算符,一個(gè)是單目運(yùn)算,還有一個(gè)是三目運(yùn)算
4.逗號(hào)的運(yùn)算符優(yōu)先級(jí)最低
5.大概順序:算數(shù)運(yùn)算符 > 關(guān)系運(yùn)算符 > 邏輯運(yùn)算符(邏輯非(!) 除外) > 賦值運(yùn)算符 > 逗號(hào)運(yùn)算符
---同1級(jí)別優(yōu)先級(jí)時(shí):. 高于 *(指針取值的*),[] 高于 *,函數(shù)() 高于 *,==和!=高于位操作、也高于賦值符,算術(shù)運(yùn)算符 高于 位移運(yùn)算符,逗號(hào)在所有運(yùn)算符優(yōu)先級(jí)最低
6.不需要刻意背,多用就有印象了
*/