C語言的運算符主要用于構(gòu)成表達(dá)式,同一個符號在不同的表達(dá)式中,其作用并不一致。下面按計算的優(yōu)先順序,分別說明不同作用的表達(dá)式。需要特別指出,在C語言標(biāo)準(zhǔn)中,并沒有結(jié)合性的說法。

創(chuàng)新互聯(lián)公司主營醴陵網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā),醴陵h5微信小程序開發(fā)搭建,醴陵網(wǎng)站營銷推廣歡迎醴陵等地區(qū)企業(yè)咨詢
相同優(yōu)先級運算符,從左至右依次運算。注意后綴運算優(yōu)先級高于前綴。因此++i++應(yīng)解釋為++(i++)。
而與或非的運算優(yōu)先級都不一樣,因此a b || b c解釋為(a b) || (b c)
合理使用優(yōu)先級可以極大簡化表達(dá)式。
基本表達(dá)式 1級
基本表達(dá)式(Primary expressions),主要是用于運算符之間,做為運算數(shù)。
標(biāo)識,常量,字符串文字量,優(yōu)先級提升表達(dá)式最優(yōu)先執(zhí)行。
優(yōu)先級提升表達(dá)式是指圓括號包圍的表達(dá)式,如“( expression )”
后綴表達(dá)式 2極
postfix-expression [ expression ],數(shù)組下標(biāo)運算。
postfix-expression ( argument-expression-list),函數(shù)調(diào)用,括號內(nèi)的參數(shù)可選。
postfix-expression . identifier,成員訪問,
postfix-expression - identifier,成員訪問,-號之前應(yīng)為指針。
postfix-expression ++,后綴自增
postfix-expression --,后綴自減
( type-name ) { initializer-list }
( type-name ) { initializer-list , } 復(fù)合初始化,C99后新增。例如
int* a = (int[]) { 1, 2, 3 };
//等價于 int unamed[] = {1, 2, 3}; //unamed表示一個不可見的變量名。
int* a = unamed;
單目/一元運算 3級
++ unary-expression 前綴自增
-- unary-expression 前綴自減
unary-operator cast-expression 單目轉(zhuǎn)型表式式, 包括 取地址 ,提領(lǐng) * , 正號+ ,負(fù)號- 位反~ 邏輯否!。
sizeof unary-expression 求類型長度,對表達(dá)式求類型長度
sizeof ( type-name ) 求類型長度
強制類型表達(dá)式 4級
( type-name ) cast-expression,強制表達(dá)式成為type-name指定的類型。
乘法表達(dá)式 5級
“ * ” 乘法運算符;“ / ”除法運算符;“ % ” 取余運算符。
加法運算符 6級
“ + ”加法運算符;“ - ”減法運算符。
移位運算符 7級
左移運算符; 右移運算符。
關(guān)系運算符 8級
、=、、=關(guān)系運算符。
相等運算符 9級
“ == ”等于運算符;“ != ”不等于運算符。
位與運算符 10級
“ ”按位與運算符
位異或運算符 11級
“ ∧ ”按位異或運算符(Bitwise exclusive OR operator)。
位或運算符 12 級
“ | ”按位或運算符(Bitwise inclusive OR operator)。
邏輯與運算符 13級
“”邏輯與運算符。
邏輯或運算符 14 級
“ || ”邏輯或運算符。
三元條件運算符 15級
? :條件運算符。
賦值運算符 16 級
=、 +=、 -=、 *=、 /=、 %=、 =、 ^=、 |=、 =、 =賦值運算符。
逗號運算符 17級
“,”逗號運算符。
[pre]C 語言中,逗號(,)也可以是運算符,稱為逗號運算符(Comma Operator)。逗號運算符可以把兩個以上(包含兩個)的表達(dá)式連接成一個表達(dá)式,稱為逗號表達(dá)式。其一般形式為:
子表達(dá)式1, 子表達(dá)式2, ..., 子表達(dá)式n
例如:
a + b, c = b, c++
逗號運算符的優(yōu)先級是所有運算符中級別最低的,通常配合 for 循環(huán)使用。逗號表達(dá)式最右邊的子表達(dá)式的值即為逗號表達(dá)式的值。上例中,c++ 的值(c 自增之前的值)即為該表達(dá)式的值。
逗號運算符保證左邊的子表達(dá)式運算結(jié)束后才進行右邊的子表達(dá)式的運算。也就是說,逗號運算符是一個序列點,其左邊所有副作用都結(jié)束后,才對其右邊的子表達(dá)式進行運算。因此,上例中,c 得到 b 的值后,才進行自增運算。
優(yōu)先級:C語言中,運算符的運算優(yōu)先級共分為15 級。1 級最高,15 級最低。 在表達(dá)式中,優(yōu)先級較高的先于優(yōu)先級較低的進行運算。而在一個運算量兩側(cè)的運算符 優(yōu)先級相同時,則按運算符的結(jié)合性所規(guī)定的結(jié)合方向處理。
結(jié)合性:C語言中各運算符的結(jié)合性分為兩種,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。例如算術(shù)運算符的結(jié)合性是自左至右,即先左后右。如有表達(dá)式x-y+z 則y 應(yīng)先與“-”號結(jié)合,執(zhí)行x-y 運算,然后再執(zhí)行+z 的運算。這種自左至右的結(jié)合 方向就稱為“左結(jié)合性”。而自右至左的結(jié)合方向稱為“右結(jié)合性”。最典型的右結(jié)合 性運算符是賦值運算符。如x=y=z,由于“=”的右結(jié)合性,應(yīng)先執(zhí)行y=z 再執(zhí)行x=(y=z)運算。C語言運算符中有不少為右結(jié)合性,應(yīng)注意區(qū)別,以避免理解錯誤。
優(yōu)先級從上到下依次遞減,最上面具有最高的優(yōu)先級,逗號操作符具有最低的優(yōu)先級。
所有的優(yōu)先級中,只有三個優(yōu)先級是從右至左結(jié)合的,它們是單目運算符、條件運算符、賦值運算符。其它的都是從左至右結(jié)合。
具有最高優(yōu)先級的其實并不算是真正的運算符,它們算是一類特殊的操作。()是與函數(shù)相關(guān),[]與數(shù)組相關(guān),而-及.是取結(jié)構(gòu)成員。
其次是單目運算符,所有的單目運算符具有相同的優(yōu)先級,因此在我認(rèn)為的 真正的運算符中它們具有最高的優(yōu)先級,又由于它們都是從右至左結(jié)合的,因此*p++與*(p++)等效是毫無疑問的。
另外在C語言里,沒有前置后置之分,因為++ -- 是右結(jié)合所以右側(cè)優(yōu)先運算,表現(xiàn)為 "操作數(shù)后置優(yōu)先級比較高" 的假象,前置和后置的區(qū)分是因為運算符重載而后加入C++的
接下來是算術(shù)運算符,*、/、%的優(yōu)先級當(dāng)然比+、-高了。
移位運算符緊隨其后。
其次的關(guān)系運算符中, = =要比 == !=高一個級別,不大好理解。
所有的邏輯操作符都具有不同的優(yōu)先級(單目運算符除外,!和~)
邏輯位操作符的"與"比"或"高,而"異或"則在它們之間。
跟在其后的比||高。
接下來的是條件運算符,賦值運算符及逗號運算符。
在C語言中,只有4個運算符規(guī)定了運算方向,它們是、| |、條件運算符及賦值運算符。
、| |都是先計算左邊表達(dá)式的值,當(dāng)左邊表達(dá)式的值能確定整個表達(dá)式的值時,就不再計算右邊表達(dá)式的值。如 a = 0 b; 運算符的左邊位0,則右邊表達(dá)式b就不再判斷。
在條件運算符中。如a?b:c;先判斷a的值,再根據(jù)a的值對b或c之中的一個進行求值。
賦值表達(dá)式則規(guī)定先對右邊的表達(dá)式求值,因此使 a = b = c = 6;成為可能。
口訣注釋
優(yōu)先級等級口訣
圓方括號、箭頭一句號, 自增自減非反負(fù)、針強地址長度,
乘除,加減,再移位,
小等大等、等等不等,
八位與,七位異,六位或,五與,四或,三疑,二賦,一真逗。
其中“,”號為一個等級分段。
優(yōu)先級等級注釋
“圓方括號、箭頭一句號”指的是第15級的運算符。其中圓方括號很明顯“()、[]”,箭頭 指的是指向結(jié)構(gòu)體成員運算符“-”,句號 指的是結(jié)構(gòu)體成員運算符“.” ;
“自增自減非反負(fù)、針強地址長度”指的是第14級的運算符。其中 非 指的是邏輯運算符“!”,反 指的是按位取反運算符“~”,負(fù) 指的是負(fù)號運算符“-”,針 指的是指針運算符“*”,強 指的是強制類型轉(zhuǎn)換運算符,地址 指的是地址運算符“”,長度 指的是長度運算符“sizeof ”;
“乘除,加減,再移位”移位指的是左移運算符“”和右移運算符“”,其中除法還包括了 取余運算符“%”;
“小等大等、等等不等” 指的是第10級到第9級的運算符:、=、和=,等等指的是等于運算符==,不等指的是不等于運算符!=
“八位與,七位異,六位或”其中 八位與 指的是第8級的 按位與 運算符“”,七位異 指的是第7級的按位異或運算符“^”,六位或 指的是第6級的按位或運算符“|”;
“五與,四或”指的是第5級、第4級的邏輯與運算符“”和邏輯或運算符“||”;
“三疑,二賦,一真逗”指的是第3級到第1級的運算符。其中,三疑指的是條件運算符“?:” (三有雙重含義:即指優(yōu)先級別是三,它的運算符類型也是三目,疑也取“?”之意),二賦 指的是賦值運算符=、+=、-=、*=、/=、%=、=、=、=、^=和|= ,一真逗 指的是第1級的“,”運算符,真字只是為了語句需要罷了。
由于C語言的運算符優(yōu)先級與C++的不完全一樣(主要是增加了幾個運算符),所以這個口訣不能完全實用于C++.但是應(yīng)該能夠兼容,大家可以比較一下他們的區(qū)別應(yīng)該就能夠很快掌握C++的優(yōu)先級的!
應(yīng)用舉例
1、賦值運算符:a=5;
a=b=0;
第一個賦值語句把5賦給變量a;第二個賦值語句的意思是把0同時賦值給兩個變量。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算,先b=0,然后a=b。
2、復(fù)合賦值運算符:a=1;a+=3;
上面第二個賦值語句等價于a=a+3;即a=4。
3、算術(shù)運算符:Area=Height*Width;num=num1+num2/num3-num4;
第一個賦值語句Height和Width相乘結(jié)果賦給變量Area;第二個賦值語句先完成num2與num3的整除運算,然后與num1相加,再減去num4,結(jié)果賦給num。運算符運算順序先算乘除再算加減。單目正和單目負(fù)最先運算。
4、邏輯運算符:a=1,b=1;
a||b-1;
因為a=1為真值,所以不管b-1是不是真值,總的表達(dá)式一定為真值,這時后面的表達(dá)式就不會再計算了。
5、關(guān)系運算符:if(a0)...
如果a0,則執(zhí)行if語句中的內(nèi)容,否則退出。
6、條件運算符:a=(b0)?b:-b;
當(dāng)b0時,a=b;當(dāng)b不大于0時,a=-b;其實上面的意思就是把b的絕對值賦值給a。
7、逗號運算符:b=2,c=7,d=5;
a=(++b,c--,d+3);
有三個表達(dá)式,用逗號分開,所以最終的值應(yīng)該是最后一個表達(dá)式的值,也就是d+3=8,所以a=8。
8、位邏輯運算符
包括:1。位與符 2。|位或符 3。^位異或符 4。~位取反符
以操作數(shù)12為例。位運算符將數(shù)字12視為1100。位運算符將操作數(shù)視為位而不是數(shù)值。數(shù)值
可以是任意進制的:十進制、八進制或十六進制。位運算符則將操作數(shù)轉(zhuǎn)化為二進制,并相應(yīng)地返回1或0。
位運算符將數(shù)字視為二進制值,并按位進行相應(yīng)運算,運算完成后再重新轉(zhuǎn)換為數(shù)字。例如:
表達(dá)式1015表示(1010 1111),它將返回表示1010的值10。因為真真得真,或者是11得1,同位全是1結(jié)果也是1
表達(dá)式10|15表示(1010 | 1111),它將返回表示1111的值15。假假得假。全零得零。
表達(dá)式10^15表示(1010 ^ 1111), 它將返回表示0101的值5。此時是同性相斥,相同的就為假。
表達(dá)式~10表示(~1010),它將返回表示0101的值 -11。此號好理解,按位取反。
#includestdio.h
int?isprime(int?n){
int?i;
if(n==1)
return?0;???
for(i=2;in;i++)??
if(n%i==0)
return?0;??
return?1;??????
}
int?main()
{
int?sum=0;
int?i;
for(i=3;i=1100;i++)
if(isprime(i)==1)??
printf("%d?",i);????
}
#includestdio.h
#includemath.h
int prime(int n)/*判斷是否為素數(shù)函數(shù),是返回1,不是返回0 */
{int i;
for(i=2;isqrt(n);i++) /*循環(huán)除去sqrt(n)以下的數(shù)*/
{
if(n%i==0)
return(0);/*如果不是素數(shù),返回0*/
}
return 1;/*如果是素數(shù),返回1*/
}
main(void)
{int i;
printf("\n\n=== start ===\n\n");
for(i=1000;i=1100;i++)
{
if(prime(i))/*得到素數(shù)*/
printf("%d is a prime",i);
}
getch();
}
十六進制怎么表示的?
如果這樣表示int num=0x25AB,調(diào)用下面程序即可
void rev(int num,int k) //num為數(shù)值,k為進制
{
char p[10];
int count=0;
while(num0)
{
p[count]=num%k;
num=num/k;count++;
}
printf("%s",p);
return;
}
如果用字符串表示,那就簡單了,用個switch-case就行了
0 0000 1 0001 2 0010 3 0011 4 0100
5 0101 6 0110 7 0111 8 1000 9 1001
A 1010 B 1011 C 1100 D 1101 E 1110
F 1111
default:exit(0);
#include "stdio.h"
void main()
{
for(int i=3;i=1100;i++)/*確定范圍:3——1100*/
{
for(int k=2;ki;k++)
{
if(i%k==0)break;/*如果找到一個不是1或者它本身的因子,則停止該循環(huán),此時ki*/
}
if(k==i)printf("%d\n",i);/*當(dāng)k=i時表明i不存在除1和本身以外因子,因而它是素數(shù),打出來*/
}
}
文章題目:c語言函數(shù)1100,C語言函數(shù)指針
標(biāo)題來源:http://chinadenli.net/article2/dsgiooc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、響應(yīng)式網(wǎng)站、建站公司、網(wǎng)站維護、網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)