第一篇:C語言中的邏輯運算符和位運算符總結
老分不清一個&號和倆的用法,今天專門拿出來整理整理:
一、邏輯運算符:
包括:1。&&邏輯與 2。||邏輯或 3。!邏輯非
邏輯運算符用于對包含關系運算符的表達式進行合并或取非 對于使用邏輯運算符的表達式,返回0表示“假”,返回1表示“真”。關于邏輯運算符的解釋 請注意:任何使用兩個字符做符號的運算符,兩字符之間不應有空格,即將==寫成= =是錯誤的。假設一個程序在同時滿足條件a<10和b==7時,必須執行某些操作。應使用關系運算符和邏輯運算符“與”來寫這個
條件的代碼。用&&表示“與”運算符,該條件代碼如下:
(a<10)&&(b==7);類似地,“或”是用于檢查兩個條件中是否有一個為真的運算符。它由兩個連續的管道符號(||)表示。如果上例
改為:如果任一語句為真,則程序需執行某些操作,則條件代碼如下:
(a<10)||(b==7);第三個邏輯運算符“非”用一個感嘆號(!)表示。這個運算符對表達式的真值取反。例如,如果變量s小于10,程序
程序需執行某些操作,則條件代碼如下:
(s<10)或
(!(s>=10))//s不大于等于10 關系運算符和邏輯運算符的優先級一般都低于算術運算符。例如,5>4+3的計算與5>(4+3)運算符是一樣的,即
先計算4+3,再執行關系運算。此表達示的結果為“假”,即,將返回0。下面的語句
printf(“%d”,5>4+3);將輸出 0
可以總結為:&&的結果是真真為真。||的結果是假假為假。
二、位運算符:
包括:1。&位與符 2。|位或符 3。^位異或符 4。~位取反符
以操作數12為例。位運算符將數字12視為1100。位運算符將操作數視為位而不是數值。數值 可以是任意進制的:十進制、八進制或十六進制。位運算符則將操作數轉化為二進制,并相應地返回1或0。
位運算符將數字視為二進制值,并按位進行相應運算,運算完成后再重新轉換為數字。例如: 表達式10&15表示(1010 & 1111),它將返回表示1010的值10。因為真真得真,或者是11得1,同位全是1結果也是1 表達式10|15表示(1010 | 1111),它將返回表示1111的值15。假假得假。全零得零。
表達式10^15表示(1010 ^ 1111), 它將返回表示0101的值5。此時是同性相斥,相同的就為假。表達式~10表示(~1010),它將返回表示0101的值-11。此號好理解,按位取反
C語言運算符 百科名片
運算符是告訴編譯程序執行特定算術或邏輯操作的符號。C語言的運算范圍很寬,把除了控制語句和輸入輸出以外的幾乎所有的基本操作都作為運算符處理。主要分為三大類:算術運算符、關系運算符與邏輯運算符、按位運算符。除此之外,還有一些用于完成特殊任務的運算符。
目錄
C語言運算符分類
運算符優先級與結合性
運算符優先級等級口訣及注釋運算符優先級等級口訣 運算符優先級等級注釋
運算符應用舉例C語言運算符分類 運算符優先級與結合性
運算符優先級等級口訣及注釋運算符優先級等級口訣 運算符優先級等級注釋 運算符應用舉例
展開編輯本段C語言運算符分類
1級(左結合)
()圓括號;[]下標運算符;->指向結構體成員運算符;.結構體成員運算符。
2級(右結合)
!邏輯非運算符;~按位取反運算符;++前綴增量運算符;--前綴減量運算符;+正號運算符;-負號運算符;(類型)類型轉換運算符;*指針運算符;&地址運算符;sizeof長度運算符。
3級(左結合)
*乘法運算符;/除法運算符;%取余運算符。
4級(左結合)
+加法運算符;-減法運算符。
5級(左結合)
<<左移運算符;>>右移運算符。
6級(左結合)
<、<=、>、>=關系運算符。
7級(左結合)
==等于運算符;!=不等于運算符。
8級(左結合)
&按位與運算符。
9級(左結合)
^按位異或運算符。
10級(左結合)
|按位或運算符。
11級(左結合)
&&邏輯與運算符。
12級(左結合)
||邏輯或運算符。
13級(右結合)
? :條件運算符。
14級(右結合)
=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=賦值運算符。
15級(左結合),逗號運算符。編輯本段運算符優先級與結合性
運算符的優先級:C語言中,運算符的運算優先級共分為15 級。1 級最高,15 級最低。在表達式中,優先級較高的先于優先級較低的進行運算。而在一個運算量兩側的運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。
運算符的結合性:C語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左后右。如有表達式x-y+z則y 應先與“-”號結合,執行x-y 運算,然后再執行+z 的運算。這種自左至右的結合方向就稱為“左結合性”。而自右至左的結合方向稱為“右結合性”。最典型的右結合性運算符是賦值運算符。如x=y=z,由于“=”的右結合性,應先執行y=z 再執行x=(y=z)
運算。C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。
優先級從上到下依次遞減,最上面具有最高的優先級,逗號操作符具有最低的優先級。
所有的優先級中,只有三個優先級是從右至左結合的,它們是單目運算符、條件運算符、賦值運算符。其它的都是從左至右結合。
具有最高優先級的其實并不算是真正的運算符,它們算是一類特殊的操作。()是與函數相關,[]與數組相關,而->及.是取結構成員。
其次是單目運算符,所有的單目運算符具有相同的優先級,因此在我認為的真正的運算符中它們具有最高的優先級,又由于它們都是從右至左結合的,因此*p++與*(p++)等效是毫無疑問的。
另外在C語言里,沒有前置后置之分,因為++--是右結合所以右側優先運算,表現為 “操作數后置優先級比較高” 的假象,前置和后置的區分是因為運算符重載而后加入C++的接下來是算術運算符,*、/、%的優先級當然比+、-高了。
移位運算符緊隨其后。
其次的關系運算符中,<<= >>=要比 ==!=高一個級別,不大好理解。
所有的邏輯操作符都具有不同的優先級(單目運算符除外,!和~)
邏輯位操作符的“與”比“或”高,而“異或”則在它們之間。
跟在其后的&&比||高。
接下來的是條件運算符,賦值運算符及逗號運算符。
在C語言中,只有4個運算符規定了運算方向,它們是&&、| |、條件運算符及賦值運算符。
&&、| |都是先計算左邊表達式的值,當左邊表達式的值能確定整個表達式的值時,就不再計算右邊表達式的值。如 a = 0 && b;&&運算符的左邊位0,則右邊表達式b就不再判斷。
在條件運算符中。如a?b:c;先判斷a的值,再根據a的值對b或c之中的一個進行求值。
賦值表達式則規定先對右邊的表達式求值,因此使 a = b = c = 6;成為可能。編輯本段運算符優先級等級口訣及注釋 運算符優先級等級口訣
圓方括號、箭頭一句號,自增自減非反負、針強地址長度,乘除,加減,再移位,小等大等、等等不等,八位與,七位異,六位或,五與,四或,三疑,二賦,一真逗。
其中“,”號為一個等級分段。運算符優先級等級注釋
“圓方括號、箭頭一句號”指的是第15級的運算符。其中圓方括號很明顯“()、[]”,箭頭指的是指向結構體成員運算符“->”,句號指的是結構體成員運算符“.”;
“自增自減非反負、針強地址長度”指的是第14級的運算符。其中非指的是邏輯運算符“!”,反指的是按位取反運算符“~”,負指的是負號運算符“-”,針指的是指針運算符“*”,強指的是強制類型轉換運算符,地址指的是地址運算符“&”,長度指的是長度運算符“sizeof”;
“乘除,加減,再移位”移位指的是左移運算符“<<”和右移運算符“>>”,其中除法還包括了取余運算符“%”;
“小等大等、等等不等”指的是第10級到第9級的運算符:<、<=、>和>=,等等指的是等于運算符==,不等指的是不等于運算符!=
“八位與,七位異,六位或”其中八位與指的是第8級的按位與運算符“&”,七位異指的是第7級的按位異或運算符“^”,六位或指的是第6級的按位或運算符“||”;
“五與,四或”指的是第5級、第4級的邏輯與運算符“&&”和邏輯或運算符“||”;
“三疑,二賦,一真逗”指的是第3級到第1級的運算符。其中,三疑指的是條件運算符“?:”(三有雙重含義:即指優先級別是三,它的運算符類型也是三目,疑也取“?”之意),二賦指的是賦值運算符=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|=,一真逗指的是第1級的“,”運算符,真字只是為了語句需要罷了。
由于C語言的運算符優先級與C++的不完全一樣(主要是增加了幾個運算符),所以這個口訣不能完全實用于C++.但是應該能夠兼容,大家可以比較一下他們的區別應該就能夠很快掌握C++的優先級的!編輯本段運算符應用舉例
·賦值運算符:a=5;a=b=0;
第一個賦值語句把5賦給變量a;第二個賦值語句的意思是把0同時賦值給兩個變量。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算,先b=0,然后a=b。
·復合賦值運算符:a=1;a+=3;
上面第二個賦值語句等價于a=a+3;即a=4。
·算術運算符:Area=Height*Width;num=num1+num2/num3-num4;
第一個賦值語句Height和Width相乘結果賦給變量Area;第二個賦值語句先完成num2與num3的整除運算,然后與num1相加,再減去num4,結果賦給num。運算符運算順序先算乘除再算加減。單目正和單目負最先運算。
·邏輯運算符:a=1,b=1;a||b-1;
因為a=1為真值,所以不管b-1是不是真值,總的表達式一定為真值,這時后面的表達式就不會再計算了。
·關系運算符:if(a>0)...如果a>0,則執行if語句中的內容,否則退出。
·條件運算符:a=(b>0)?b:-b;
當b>0時,a=b;當b不大于0時,a=-b;其實上面的意思就是把b的絕對值賦值給a。
·逗號運算符:b=2,c=7,d=5;a=(++b,c--,d+3);
有三個表達式,用逗號分開,所以最終的值應該是最后一個表達式的值,也就是d+3=8,所以a=8。
第二篇:C語言中運算符優先級
**最高最高優先級的其實并不是真正的運算符,它們是一類特殊的操作,()是與函數相關,[]是與數組相關,->是與提取相關;
總結:1.關系運算符優于邏輯運算符
2.移位運算符介于算術運算符和比較運算符之間
3.除單目運算符外,算術運算符的優先級最高
***結合方向自右向左的只有三類:賦值、單目和三目,其它的都是從左至右結合單目運算符 > 算術運算符 > 移位運算符 > 關系運算符 > 邏輯運算符 > 條件運算符 > 賦值運算符 > 逗號運算符
單目運算符:!邏輯非運算符;~按位取反運算符;++前綴增量運算符;--前綴減量運算符;+正號運算符;-負號運算符;(類型)類型轉換運算符;*指針運算符;&地址運算符;sizeof長度運算符;
算數運算符:*, /, %, +,-;
移位運算符:<<左移運算符,>>右移運算符;
關系運算符:<、<=、>、>=關系運算符; ==等于運算符,!=不等于運算符;
邏輯運算符:&按位與運算符,^按位異或運算符,|按位或運算符,&&邏輯與運算符,||邏輯或運算符;
條件運算符:? :
賦值運算符:=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=賦值運算符;
逗號運算符:,***前置++運算符是在表達式開始之間運算,后置++運算符是在表達式結束之后運算;(--)運算符也是一樣
第三篇:運算符與表達式練習題附答案
1.以下運算符中優先級最高的是()。A.&&
B.+ C.!=
D.?: 2.能正確表示邏輯關系:“a≥10或 a≤0”的C語言表達式是()。A.a>=10 or a<=0 B.a>=10| a<=0 C.a>=10 && a<=0 D.a>=10||a<=0 3.C語言中運算對象必需是整型的運算符是()。(A)+(B)/(C)%(D)* 4.已知int i;float f;正確的表達式是()。A)(int f)%i B)int(f)%i C)int(f % i)D)(int)f % i 5.下列程序的輸出結果是()。
void main(){ int a=7,b=5;printf(“%dn”,b=b%a);}(A)0(B)1(C)5(D)不確定值 6.若有定義:int a=8,b=5,c;,執行語句c=a/b+0.4;后,c的值為()。(A)1.4(B)1(C)2.0(D)2 7.已知x=4.5,y=2.5,求表達式(x+y)/2+(int)y%(int)x的值()。A)3 B)5 C)3.5 D)5.5 8.已知各變量的類型如下
int i=8,k,a,b;unsigned long w=5;double x=1.42,y=5.2;則以下符合C語言語法的表達式是()。(A)a+=a-=(b=4)*(a=3)(B)a=a*3+2(C)x%(-3)(D)y=float(i)9.已知int a,b;執行語句a=(b=3*2,b*4),a+6;后變量a的值為()。A)6 B)12 C)24 D)30 10.若有以下程序
main(){ int k=2,i=2,m;m=(k+=i*=k);printf(“%d,%dn”,m,i);} 執行后的輸出結果是()。(A)8,6(B)8,3(C)6,4(D)7,4 11.設 int i,j=5;執行語句i=(++j)+(++j);后i的值是()。
A)10 B)12 C)13 D)14 12.設int x=10,y,z;執行y=z=x++;x=y==z后,變量x的值是()。
A)0 B)1 C)10 D)11 13.以下程序段的輸出是()。main()
{ char x =‘A’ ;
x =(x>=‘A’&& x<=‘Z’)?(x+32): x;printf(“%c”,x); } A)A B)a C)Z D)z 14.若x=3,y=2,z=1,求下列表達式的z值為()。z+=(x (A)1(B)2(C)3(D)4 15、若變量已正確定義,要將 a和b中的數進行交換,下面不正確的語句組是()。(A)s=a;a=b;b=s;(B)a=a+b;b=a-b;a=a-b;(C)s=b;b=a;a=s;(D)a=s;s=b;b=a;16.以下程序的輸出結果是()。 main() { int a=4,b=5,c=0,d;d=!a&&!b||!c;printf(“%d\n”,d);}(A)1(B)0(C)非0的數(D)-1 答案: 1、B 2、D 3、C 4、D 5、C 6、B 7、D 8、A 9、C 10、C 11、D 16、A 12、B、B 14、C 15、D C語言位運算符:與、或、異或、取反、左移和右移 語言位運算符:與、或、異或、取反、左移和右移 位運算是指按二進制進行的運算。在系統軟件中,常常需要處理二進制位的問題。C語言提供了6個位操作運算符。這些運算符只能用于整型操作數,即只能用于帶符號或無符號的char,short,int與long類型。C語言提供的位運算符列表: 運算符 含義 描述 & 按位與 如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0 | 按位或 兩個相應的二進制位中只要有一個為1,該位的結果值為1 ^ 按位異或 若參加運算的兩個二進制位值相同則為0,否則為1 ~ 取反 ~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0 << 左移 用來將一個數的各二進制位全部左移N位,右補0 >> 右移 將一個數的各二進制位右移N位,移到右端的低位被舍棄,對于無符號數,高位補0 1、“按位與”運算符(&) 按位與是指:參加運算的兩個數據,按二進制位進行“與”運算。如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。按位與其實與邏輯上“與”的運算規則一致。邏輯上的“與”,要求運算數全真,結果才為真。若,A=true,B=true,則A∩B=true 例如:3&5 3的二進制編碼是11(2)。(為了區分十進制和其他進制,本文規定,凡是非十進制的數據均在數據后面加上括號,括號中注明其進制,二進制則標記為2)內存儲存數據的基本單位是字節(Byte),一個字節由8個位(bit)所組成。位是用以描述電腦數據量的最小單位。二進制系統中,每個0或1就是一個位。將11(2)補足成一個字節,則是00000011(2)。5的二進制編碼是101(2),將其補足成一個字節,則是00000101(2)按位與運算: 00000011(2)&00000101(2)00000001(2)由此可知3&5=1 c語言代碼: #include 若想對一個存儲單元清零,即使其全部二進制位為0,只要找一個二進制數,其中各個位符合一下條件: 原來的數中為1的位,新數中相應位為0。然后使二者進行&運算,即可達到清零目的。 例:原數為43,即00101011(2),另找一個數,設它為148,即10010100(2),將兩者按位與運算: 00101011(2)&10010100(2)00000000(2)c語言源代碼: #include 若有一個整數a(2byte),想要取其中的低字節,只需要將a與8個1按位與即可。a 00101100 10101100 b 00000000 11111111 c 00000000 10101100(3)保留指定位: 與一個數進行“按位與”運算,此數在該位取1.例如:有一數84,即01010100(2),想把其中從左邊算起的第3,4,5,7,8位保留下來,運算如下: 01010100(2)&00111011(2)00010000(2)即:a=84,b=59 c=a&b=16 c語言源代碼: #include 2、“按位或”運算符(|) 兩個相應的二進制位中只要有一個為1,該位的結果值為1。借用邏輯學中或運算的話來說就是,一真為真。 例如:60(8)|17(8),將八進制60與八進制17進行按位或運算。00110000 |00001111 00111111 c語言源代碼: #include 3、交換兩個值,不用臨時變量 例如:a=3,即11(2);b=4,即100(2)。想將a和b的值互換,可以用以下賦值語句實現: a=a∧b;b=b∧a;a=a∧b;a=011(2)(∧)b=100(2)a=111(2)(a∧b的結果,a已變成7) (∧)b=100(2)b=011(2)(b∧a的結果,b已變成3) (∧)a=111(2) a=100(2)(a∧b的結果,a已變成4)等效于以下兩步: ① 執行前兩個賦值語句:“a=a∧b;”和“b=b∧a;”相當于b=b∧(a∧b)。 ② 再執行第三個賦值語句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),因此,相當于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。很神奇吧!c語言源代碼: #include 4、“取反”運算符(~) 他是一元運算符,用于求整數的二進制反碼,即分別將操作數各二進制位上的1變為0,0變為1。例如:~77(8)源代碼: #include 5、左移運算符(<<) 左移運算符是用來將一個數的各二進制位左移若干位,移動的位數由右操作數指定(右操作數必須是非負 值),其右邊空出的位用0填補,高位左移溢出則舍棄該高位。 例如:將a的二進制數左移2位,右邊空出的位補0,左邊溢出的位舍棄。若a=15,即00001111(2),左移2 位得00111100(2)。源代碼: #include 數左移時被溢出舍棄的高位中不包含1的情況。 假設以一個字節(8位)存一個整數,若a為無符號整型變量,則a=64時,左移一位時溢出的是0,而左移2位時,溢出的高位中包含1。 6、右移運算符(>>) 右移運算符是用來將一個數的各二進制位右移若干位,移動的位數由右操作數指定(右操作數必須是非負 值),移到右端的低位被舍棄,對于無符號數,高位補0。對于有符號數,某些機器將對左邊空出的部分 用符號位填補(即“算術移位”),而另一些機器則對左邊空出的部分用0填補(即“邏輯移位”)。注 意:對無符號數,右移時左邊高位移入0;對于有符號的值,如果原來符號位為0(該數為正),則左邊也是移 入0。如果符號位原來為1(即負數),則左邊移入0還是1,要取決于所用的計算機系統。有的系統移入0,有的 系統移入1。移入0的稱為“邏輯移位”,即簡單移位;移入1的稱為“算術移位”。例: a的值是八進制數113755: a:***1(用二進制形式表示) a>>1: ***0(邏輯右移時)a>>1: ***0(算術右移時)在有些系統中,a>>1得八進制數045766,而在另一些系統上可能得到的是145766。Turbo C和其他一些C 編譯采用的是算術右移,即對有符號數右移時,如果符號位原來為1,左面移入高位的是1。源代碼: #include 7、位運算賦值運算符 位運算符與賦值運算符可以組成復合賦值運算符。 例如: &=, |=, >>=, <<=, ∧= 例: a & = b相當于 a = a & b a << =2相當于a = a << 2 運算符重載類型轉換與類模板實驗報告 實驗題目 運算符重載類型轉換與類模板 日期 班級 組別 姓名 類型 【實驗目的】 1.掌握運算符重載的定義及實現。 2.熟練掌握運算符重載為類成員函數和重載為一般普通函數的區別。 3.掌握類型轉換的方法。 【實驗原理】 將運算符“+=”重載為適用于兩個復數的復合賦值運算。 【實驗器材】 微型計算機、Visual C++ 6.0 集成軟件平臺 【實驗步驟】 1.編輯源程序.2.對源程序進行編譯并調試程序.3.連接并運行程序; 4.檢查輸出結果是否正確。 程序設計如下: #include double real;double imag;};Data Data::operator +=(Data x){ real = x.real+real;imag = x.imag+imag;return *this;} void Data::print(){ cout <<“(”< 【實驗結論】第四篇:C語言位運算符:與、或、異或、取反、左移和右移
第五篇:運算符重載類型轉換與類范文實驗報告