中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

c語言用順序表做函數(shù)參數(shù) c語言函數(shù)參數(shù)求值順序

C語言參數(shù)中表達(dá)式計(jì)算順序問題

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

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、阜寧網(wǎng)站維護(hù)、網(wǎng)站推廣。

相同優(yōu)先級運(yùn)算符,從左至右依次運(yùn)算。注意后綴運(yùn)算優(yōu)先級高于前綴。因此++i++應(yīng)解釋為++(i++)。

而與或非的運(yùn)算優(yōu)先級都不一樣,因此a b || b c解釋為(a b) || (b c)

合理使用優(yōu)先級可以極大簡化表達(dá)式。

基本表達(dá)式 1級

基本表達(dá)式(Primary expressions),主要是用于運(yùn)算符之間,做為運(yùn)算數(shù)。

標(biāo)識,常量,字符串文字量,優(yōu)先級提升表達(dá)式最優(yōu)先執(zhí)行。

優(yōu)先級提升表達(dá)式是指圓括號包圍的表達(dá)式,如“( expression )”

后綴表達(dá)式 2極

postfix-expression [ expression ],數(shù)組下標(biāo)運(yùn)算。

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 };

//等價(jià)于 int unamed[] = {1, 2, 3}; //unamed表示一個(gè)不可見的變量名。

int* a = unamed;

單目/一元運(yùn)算 3級

++ unary-expression 前綴自增

-- unary-expression 前綴自減

unary-operator cast-expression 單目轉(zhuǎn)型表式式, 包括 取地址 ,提領(lǐng) * , 正號+ ,負(fù)號- 位反~ 邏輯否!。

sizeof unary-expression 求類型長度,對表達(dá)式求類型長度

sizeof ( type-name ) 求類型長度

強(qiáng)制類型表達(dá)式 4級

( type-name ) cast-expression,強(qiáng)制表達(dá)式成為type-name指定的類型。

乘法表達(dá)式 5級

“ * ” 乘法運(yùn)算符;“ / ”除法運(yùn)算符;“ % ” 取余運(yùn)算符。

加法運(yùn)算符 6級

“ + ”加法運(yùn)算符;“ - ”減法運(yùn)算符。

移位運(yùn)算符 7級

左移運(yùn)算符; 右移運(yùn)算符。

關(guān)系運(yùn)算符 8級

、=、、=關(guān)系運(yùn)算符。

相等運(yùn)算符 9級

“ == ”等于運(yùn)算符;“ != ”不等于運(yùn)算符。

位與運(yùn)算符 10級

“ ”按位與運(yùn)算符

位異或運(yùn)算符 11級

“ ∧ ”按位異或運(yùn)算符(Bitwise exclusive OR operator)。

位或運(yùn)算符 12 級

“ | ”按位或運(yùn)算符(Bitwise inclusive OR operator)。

邏輯與運(yùn)算符 13級

“”邏輯與運(yùn)算符。

邏輯或運(yùn)算符 14 級

“ || ”邏輯或運(yùn)算符。

三元條件運(yùn)算符 15級

? :條件運(yùn)算符。

賦值運(yùn)算符 16 級

=、 +=、 -=、 *=、 /=、 %=、 =、 ^=、 |=、 =、 =賦值運(yùn)算符。

逗號運(yùn)算符 17級

“,”逗號運(yùn)算符。

[pre]C 語言中,逗號(,)也可以是運(yùn)算符,稱為逗號運(yùn)算符(Comma Operator)。逗號運(yùn)算符可以把兩個(gè)以上(包含兩個(gè))的表達(dá)式連接成一個(gè)表達(dá)式,稱為逗號表達(dá)式。其一般形式為:

子表達(dá)式1, 子表達(dá)式2, ..., 子表達(dá)式n

例如:

a + b, c = b, c++

逗號運(yùn)算符的優(yōu)先級是所有運(yùn)算符中級別最低的,通常配合 for 循環(huán)使用。逗號表達(dá)式最右邊的子表達(dá)式的值即為逗號表達(dá)式的值。上例中,c++ 的值(c 自增之前的值)即為該表達(dá)式的值。

逗號運(yùn)算符保證左邊的子表達(dá)式運(yùn)算結(jié)束后才進(jìn)行右邊的子表達(dá)式的運(yùn)算。也就是說,逗號運(yùn)算符是一個(gè)序列點(diǎn),其左邊所有副作用都結(jié)束后,才對其右邊的子表達(dá)式進(jìn)行運(yùn)算。因此,上例中,c 得到 b 的值后,才進(jìn)行自增運(yùn)算。

優(yōu)先級:C語言中,運(yùn)算符的運(yùn)算優(yōu)先級共分為15 級。1 級最高,15 級最低。 在表達(dá)式中,優(yōu)先級較高的先于優(yōu)先級較低的進(jìn)行運(yùn)算。而在一個(gè)運(yùn)算量兩側(cè)的運(yùn)算符 優(yōu)先級相同時(shí),則按運(yùn)算符的結(jié)合性所規(guī)定的結(jié)合方向處理。

結(jié)合性:C語言中各運(yùn)算符的結(jié)合性分為兩種,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。例如算術(shù)運(yùn)算符的結(jié)合性是自左至右,即先左后右。如有表達(dá)式x-y+z 則y 應(yīng)先與“-”號結(jié)合,執(zhí)行x-y 運(yùn)算,然后再執(zhí)行+z 的運(yùn)算。這種自左至右的結(jié)合 方向就稱為“左結(jié)合性”。而自右至左的結(jié)合方向稱為“右結(jié)合性”。最典型的右結(jié)合 性運(yùn)算符是賦值運(yùn)算符。如x=y=z,由于“=”的右結(jié)合性,應(yīng)先執(zhí)行y=z 再執(zhí)行x=(y=z)運(yùn)算。C語言運(yùn)算符中有不少為右結(jié)合性,應(yīng)注意區(qū)別,以避免理解錯(cuò)誤。

優(yōu)先級從上到下依次遞減,最上面具有最高的優(yōu)先級,逗號操作符具有最低的優(yōu)先級。

所有的優(yōu)先級中,只有三個(gè)優(yōu)先級是從右至左結(jié)合的,它們是單目運(yùn)算符、條件運(yùn)算符、賦值運(yùn)算符。其它的都是從左至右結(jié)合。

具有最高優(yōu)先級的其實(shí)并不算是真正的運(yùn)算符,它們算是一類特殊的操作。()是與函數(shù)相關(guān),[]與數(shù)組相關(guān),而-及.是取結(jié)構(gòu)成員。

其次是單目運(yùn)算符,所有的單目運(yùn)算符具有相同的優(yōu)先級,因此在我認(rèn)為的 真正的運(yùn)算符中它們具有最高的優(yōu)先級,又由于它們都是從右至左結(jié)合的,因此*p++與*(p++)等效是毫無疑問的。

另外在C語言里,沒有前置后置之分,因?yàn)?+ -- 是右結(jié)合所以右側(cè)優(yōu)先運(yùn)算,表現(xiàn)為 "操作數(shù)后置優(yōu)先級比較高" 的假象,前置和后置的區(qū)分是因?yàn)檫\(yùn)算符重載而后加入C++的

接下來是算術(shù)運(yùn)算符,*、/、%的優(yōu)先級當(dāng)然比+、-高了。

移位運(yùn)算符緊隨其后。

其次的關(guān)系運(yùn)算符中, = =要比 == !=高一個(gè)級別,不大好理解。

所有的邏輯操作符都具有不同的優(yōu)先級(單目運(yùn)算符除外,!和~)

邏輯位操作符的"與"比"或"高,而"異或"則在它們之間。

跟在其后的比||高。

接下來的是條件運(yùn)算符,賦值運(yùn)算符及逗號運(yùn)算符。

在C語言中,只有4個(gè)運(yùn)算符規(guī)定了運(yùn)算方向,它們是、| |、條件運(yùn)算符及賦值運(yùn)算符。

、| |都是先計(jì)算左邊表達(dá)式的值,當(dāng)左邊表達(dá)式的值能確定整個(gè)表達(dá)式的值時(shí),就不再計(jì)算右邊表達(dá)式的值。如 a = 0 b; 運(yùn)算符的左邊位0,則右邊表達(dá)式b就不再判斷。

在條件運(yùn)算符中。如a?b:c;先判斷a的值,再根據(jù)a的值對b或c之中的一個(gè)進(jìn)行求值。

賦值表達(dá)式則規(guī)定先對右邊的表達(dá)式求值,因此使 a = b = c = 6;成為可能。

口訣注釋

優(yōu)先級等級口訣

圓方括號、箭頭一句號, 自增自減非反負(fù)、針強(qiáng)地址長度,

乘除,加減,再移位,

小等大等、等等不等,

八位與,七位異,六位或,五與,四或,三疑,二賦,一真逗。

其中“,”號為一個(gè)等級分段。

優(yōu)先級等級注釋

“圓方括號、箭頭一句號”指的是第15級的運(yùn)算符。其中圓方括號很明顯“()、[]”,箭頭 指的是指向結(jié)構(gòu)體成員運(yùn)算符“-”,句號 指的是結(jié)構(gòu)體成員運(yùn)算符“.” ;

“自增自減非反負(fù)、針強(qiáng)地址長度”指的是第14級的運(yùn)算符。其中 非 指的是邏輯運(yùn)算符“!”,反 指的是按位取反運(yùn)算符“~”,負(fù) 指的是負(fù)號運(yùn)算符“-”,針 指的是指針運(yùn)算符“*”,強(qiáng) 指的是強(qiáng)制類型轉(zhuǎn)換運(yùn)算符,地址 指的是地址運(yùn)算符“”,長度 指的是長度運(yùn)算符“sizeof ”;

“乘除,加減,再移位”移位指的是左移運(yùn)算符“”和右移運(yùn)算符“”,其中除法還包括了 取余運(yùn)算符“%”;

“小等大等、等等不等” 指的是第10級到第9級的運(yùn)算符:、=、和=,等等指的是等于運(yùn)算符==,不等指的是不等于運(yùn)算符!=

“八位與,七位異,六位或”其中 八位與 指的是第8級的 按位與 運(yùn)算符“”,七位異 指的是第7級的按位異或運(yùn)算符“^”,六位或 指的是第6級的按位或運(yùn)算符“|”;

“五與,四或”指的是第5級、第4級的邏輯與運(yùn)算符“”和邏輯或運(yùn)算符“||”;

“三疑,二賦,一真逗”指的是第3級到第1級的運(yùn)算符。其中,三疑指的是條件運(yùn)算符“?:” (三有雙重含義:即指優(yōu)先級別是三,它的運(yùn)算符類型也是三目,疑也取“?”之意),二賦 指的是賦值運(yùn)算符=、+=、-=、*=、/=、%=、=、=、=、^=和|= ,一真逗 指的是第1級的“,”運(yùn)算符,真字只是為了語句需要罷了。

由于C語言的運(yùn)算符優(yōu)先級與C++的不完全一樣(主要是增加了幾個(gè)運(yùn)算符),所以這個(gè)口訣不能完全實(shí)用于C++.但是應(yīng)該能夠兼容,大家可以比較一下他們的區(qū)別應(yīng)該就能夠很快掌握C++的優(yōu)先級的!

應(yīng)用舉例

1、賦值運(yùn)算符:a=5;

a=b=0;

第一個(gè)賦值語句把5賦給變量a;第二個(gè)賦值語句的意思是把0同時(shí)賦值給兩個(gè)變量。這是因?yàn)橘x值語句是從右向左運(yùn)算的,也就是說從右端開始計(jì)算,先b=0,然后a=b。

2、復(fù)合賦值運(yùn)算符:a=1;a+=3;

上面第二個(gè)賦值語句等價(jià)于a=a+3;即a=4。

3、算術(shù)運(yùn)算符:Area=Height*Width;num=num1+num2/num3-num4;

第一個(gè)賦值語句Height和Width相乘結(jié)果賦給變量Area;第二個(gè)賦值語句先完成num2與num3的整除運(yùn)算,然后與num1相加,再減去num4,結(jié)果賦給num。運(yùn)算符運(yùn)算順序先算乘除再算加減。單目正和單目負(fù)最先運(yùn)算。

4、邏輯運(yùn)算符:a=1,b=1;

a||b-1;

因?yàn)閍=1為真值,所以不管b-1是不是真值,總的表達(dá)式一定為真值,這時(shí)后面的表達(dá)式就不會再計(jì)算了。

5、關(guān)系運(yùn)算符:if(a0)...

如果a0,則執(zhí)行if語句中的內(nèi)容,否則退出。

6、條件運(yùn)算符:a=(b0)?b:-b;

當(dāng)b0時(shí),a=b;當(dāng)b不大于0時(shí),a=-b;其實(shí)上面的意思就是把b的絕對值賦值給a。

7、逗號運(yùn)算符:b=2,c=7,d=5;

a=(++b,c--,d+3);

有三個(gè)表達(dá)式,用逗號分開,所以最終的值應(yīng)該是最后一個(gè)表達(dá)式的值,也就是d+3=8,所以a=8。

8、位邏輯運(yùn)算符

包括:1。位與符 2。|位或符 3。^位異或符 4。~位取反符

以操作數(shù)12為例。位運(yùn)算符將數(shù)字12視為1100。位運(yùn)算符將操作數(shù)視為位而不是數(shù)值。數(shù)值

可以是任意進(jìn)制的:十進(jìn)制、八進(jìn)制或十六進(jìn)制。位運(yùn)算符則將操作數(shù)轉(zhuǎn)化為二進(jìn)制,并相應(yīng)地返回1或0。

位運(yùn)算符將數(shù)字視為二進(jìn)制值,并按位進(jìn)行相應(yīng)運(yùn)算,運(yùn)算完成后再重新轉(zhuǎn)換為數(shù)字。例如:

表達(dá)式1015表示(1010 1111),它將返回表示1010的值10。因?yàn)檎嬲娴谜?,或者?1得1,同位全是1結(jié)果也是1

表達(dá)式10|15表示(1010 | 1111),它將返回表示1111的值15。假假得假。全零得零。

表達(dá)式10^15表示(1010 ^ 1111), 它將返回表示0101的值5。此時(shí)是同性相斥,相同的就為假。

表達(dá)式~10表示(~1010),它將返回表示0101的值 -11。此號好理解,按位取反。

關(guān)于C語言的參數(shù)傳遞順序……

樓主您好,首先您要理解一下i++的行為,即先用i,然后再++,所以,傳遞參數(shù)時(shí)先用i=1的值,用完了然后++,即先用x=y=1=i,然后i=2;我把程序給您改一下,你就會根據(jù)結(jié)果看的很明白了。

#include

stdio.h

int

f(int

x,int

y)

{

printf("x=%d\n",x);//顯示傳遞過來的i值

printf("y=%d\n",y);

//顯示傳遞過來的i++值

if(xy)

return

1;

else

if(xy)

return

-1;

else

return

0;

}

int

main()

{

int

i=1;

int

k;

k=f(i,i++);

printf("i=%d\n",i);//顯示執(zhí)行完函數(shù)后i的值

printf("k=%d\n",k);

return

0;

}

結(jié)果:x=1

y=1

i=2

k=0

樓主您的部分理解是對的,而結(jié)果有時(shí)候跟編譯器有關(guān),它的編譯順序是不一樣的。

f(++i,i)

和f(i,++i)運(yùn)行結(jié)果都與理解一致,

f(i++,i)

和f(i,i++)運(yùn)行結(jié)果與理解不一致;++是一種縮寫,對于y=i++,就是y=i,然后i=i+1;對于y=++i,就是i=i+1,然后y=i.

C語言數(shù)據(jù)結(jié)構(gòu)順序表選擇排序怎么在主函數(shù)中調(diào)用,謝謝!

SeqList L;//L只是個(gè)默認(rèn)構(gòu)造,在后面執(zhí)行基本是統(tǒng)一的0值;執(zhí)行前應(yīng)該設(shè)置實(shí)體數(shù)據(jù)

L=Selection(L.length);//改為L=Selection(L);原函數(shù)調(diào)用與函數(shù)定義不符,有語法錯(cuò)誤;L.length是個(gè)int 類型,函數(shù)定義的參數(shù)類型是SeqList;

SeqList Selection(SeqList L) 內(nèi)部邏輯不夠簡捷,多多練習(xí);

if (L.data[j]L.data [i]){}//可直接交換,k標(biāo)志沒什么作用。

c語言順序表的輸入函數(shù)

建立方法很多,線性表是順序表的順序存儲結(jié)構(gòu),這里我給你寫個(gè)簡單的例子參考一下,只要理解了,怎么寫都不會錯(cuò):具體代碼如下: #include typedef struct{ int data[100]; int length; }Seqlist;//定義Seq這個(gè)新的數(shù)據(jù)類型 void creat(Seqlist L);//建立線性表 void show(Seqlist L);//顯示線性表 int main() { Seqlist L; L.length=0;//初始化線性表的長度為0 creat(L); show(L); return 0; } void creat(Seqlist L) { int a; printf("請輸入要?jiǎng)?chuàng)建的元素的個(gè)數(shù):\t"); scanf("%d",a); for(int i=0;i

求用C語言寫這個(gè)順序表的主函數(shù)

完整代碼:

#include stdio.h

#include stdlib.h

#include windows.h

#define MAXSIZE 100

typedef int datatype;

typedef struct{

datatype a[MAXSIZE];

int size;

}sequence_list;

void init(sequence_list *slt)

{

slt-size=0;

}

void append(sequence_list *slt,datatype x)

{

if(slt-size==MAXSIZE)

{

? printf("順序表是滿的");

exit(1);

}

slt-a[slt-size]=x;

slt-size=slt-size+1;

}

void display (sequence_list slt)

{

int i;

if(!slt.size)

printf("順序表是空的");

else

for(i=0;islt.size;i++)

printf("%5d",slt.a[i]);

printf("\n");

}

int empty (sequence_list *slt)

{

memset(slt,0,sizeof(sequence_list));

return(slt-size==0?1:0);

}

int find (sequence_list slt,datatype x)

{

int i=0;

while(islt.size slt.a[i]!=x)

i++;

return(islt.size ? i:-1);

}

datatype get(sequence_list slt,int i)

{

if(i0||i=slt.size)

{

printf("\n指定位置的節(jié)點(diǎn)不存在");

exit(1);

}

else

? return slt.a[i];

}

void insert(sequence_list *slt,datatype x,int position)

{

int i;

if(slt-size==MAXSIZE)

{

printf("\n順序表是滿的,無法插入");

exit(1);

}

if(position0||positionslt-size)

{

printf("\n指定的插入位置不存在");

exit(1);

}

for(i=slt-size;iposition;i--)

slt-a[i]=slt-a[i-1];

slt-a[position]=x;

slt-size++;

}

void dele(sequence_list *slt,int position)

{

int i;

if(slt-size==0)

{

printf("\n順序表是空的,無法刪除");

exit(1);

}

if(position0||position=slt-size)

{

printf("\n指定的刪除位置不存在");

exit(1);

}

for(i=position;islt-size-1;i++)

? slt-a[i]=slt-a[i+1];

? slt-size--;

}

int main()

{

sequence_list slt;

bool exit_flag=false;

int fun_num=1;

datatype data=0;

int i=0;

printf("1.初始化 ?2.增加節(jié)點(diǎn) ?3.顯示 ?4.清空 ?5.查找\n6.獲取節(jié)點(diǎn) 7.插入節(jié)點(diǎn) ?8.刪除節(jié)點(diǎn) ?9.退出 ?0.清屏\n");

while (!exit_flag)

{

printf("請選擇功能:\n");

scanf("%d",fun_num);

switch (fun_num)

{

case 1:

init(slt);

break;

case 2:

printf("請輸入數(shù)據(jù):\n");

scanf("%d",data);

append(slt,data);

break;

case 3:

display (slt);

break;

case 4:

empty (slt);

break;

case 5:

printf("請輸入查找的數(shù)據(jù):\n");

scanf("%d",data);

printf("查找到的數(shù)據(jù)位置為:%d",find (slt,data));

printf("\n");

break;

case 6:

printf("請輸入數(shù)據(jù)位置:\n");

scanf("%d",i);

printf("該位置的數(shù)據(jù)為:%d",get(slt,i));

printf("\n");

break;

case 7:

printf("請輸入插入節(jié)點(diǎn)位置:\n");

scanf("%d",i);

printf("請輸入插入節(jié)點(diǎn)數(shù)據(jù):\n");

scanf("%d",data);

insert(slt,data,i);

break;

case 8:

printf("請輸入刪除節(jié)點(diǎn)位置:\n");

scanf("%d",i);

dele(slt,i);

break;

case 9:

exit_flag=true;

break;

case 0:

system("CLS");

printf("1.初始化 ?2.增加節(jié)點(diǎn) ?3.顯示 ?4.清空 ?5.查找\n6.獲取節(jié)點(diǎn) 7.插入節(jié)點(diǎn) ?8.刪除節(jié)點(diǎn) ?9.退出 ?0.清屏\n");

break;

default:

break;

}

}

return 0;

}

效果如下圖,調(diào)試通過,所有功能好使

c語言參數(shù)求值順序

當(dāng)實(shí)參列表包括多個(gè)實(shí)參時(shí),對實(shí)參的求值順序是不確定的,

有的系統(tǒng)按自左至右順序求實(shí)值,

有的系統(tǒng)則安自右至左的順序。

許多C版本(如turbo

c

和ms

c)是自右而左的順序求值

(見譚浩強(qiáng)C語言程序第二版p150)

故上述程序先算i++,

第二個(gè)參數(shù)的值為i=2之后i的值變?yōu)?,

再將i代入第一個(gè)參數(shù),

故兩個(gè)參數(shù)的值分別為3,2,所以計(jì)算結(jié)果為1

文章題目:c語言用順序表做函數(shù)參數(shù) c語言函數(shù)參數(shù)求值順序
文章路徑:http://m.rwnh.cn/article12/hhgpgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、服務(wù)器托管、微信公眾號自適應(yīng)網(wǎng)站、面包屑導(dǎo)航、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
新密市| 武冈市| 纳雍县| 达拉特旗| 南丰县| 郎溪县| 岢岚县| 龙岩市| 长白| 时尚| 阿拉善盟| 敦化市| 铁岭县| 乌拉特中旗| 北宁市| 汤原县| 石泉县| 长治县| 股票| 灌南县| 临邑县| 土默特右旗| 栖霞市| 抚顺县| 常州市| 西丰县| 容城县| 本溪市| 凉山| 呈贡县| 滨州市| 潮安县| 泌阳县| 家居| 新竹市| 大同市| 济源市| 东兴市| 抚宁县| 延长县| 嘉荫县|