白宗輝
摘要:通過具體的步驟和案例分析,詳解C語言表達(dá)式的運(yùn)算方法和技巧。論文的研究成果,即是表達(dá)式求解的具體思路、方法和技巧,可以為C語言學(xué)習(xí)者借鑒學(xué)習(xí),也可以為C語言教師提供教學(xué)參考。
關(guān)鍵詞:表達(dá)式運(yùn)算;運(yùn)算符;方法;技巧
中圖分類號:TP311 ? ? ?文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)32-0109-02
C語言中的表達(dá)式的類型比較多,有算術(shù)表達(dá)式,賦值表達(dá)式,條件表達(dá)式,逗號表達(dá)式,關(guān)系表達(dá)式和邏輯表達(dá)式等。每種表達(dá)式都有特定的運(yùn)算符,有的有一個,有的有多個。 我們實(shí)際學(xué)習(xí)中遇到的表達(dá)式,大部分不是一種表達(dá)式,而是幾種不同類型的混合表達(dá)式,表達(dá)式中更有多種不同的運(yùn)算符和操作數(shù)。
因此很多學(xué)習(xí)C程序設(shè)計(jì)的學(xué)生,比較畏懼c語言表達(dá)式的運(yùn)算問題,遇到之后,感覺無從下手。本文將深入探究有關(guān)c語言表達(dá)式的運(yùn)算技巧問題,供C語言學(xué)習(xí)的初學(xué)者和C語言授課教師借鑒和參考。
1考慮優(yōu)先級
1)定義:表達(dá)是由各種運(yùn)算符和操作數(shù)組成,一個表達(dá)式中,操作數(shù)和運(yùn)算符的結(jié)合先后次序是由運(yùn)算符的優(yōu)先級決定。不同的運(yùn)算符具有不同的優(yōu)先級。優(yōu)先級越高,越先進(jìn)行計(jì)算。
2) C運(yùn)算優(yōu)先級與結(jié)合性表(表一):C語言運(yùn)算符的優(yōu)先級共有15級,按照次序,最高的是1級,最低的是15級。
要求學(xué)生必須熟記每一種運(yùn)算符的優(yōu)先級。
3)應(yīng)用舉例。
例1,c語言表達(dá)式:-a+(a+b)/2。分析表達(dá)式后可知,表達(dá)式中優(yōu)先級最高的運(yùn)算符是“()”是1級,余下依次是“-”是2級,“/”是3級,“+”是4級。表達(dá)式的運(yùn)算過程:
(1)求負(fù)運(yùn)算符高于加法運(yùn)算符,先求-a的值。
(2)括號運(yùn)算符優(yōu)先級高于除法優(yōu)先級,求(a+6)的值。
(3)除法的優(yōu)先級高于加法優(yōu)先級,求(2)/2的值。
(4)求(1)+(3)的值,結(jié)算線束。
2考慮結(jié)合性
1)定義:如果運(yùn)算符的優(yōu)先級相同,那么運(yùn)算次序由結(jié)合性決定。結(jié)合性是指操作數(shù)左右兩邊的兩個運(yùn)算符的優(yōu)先級相同時,應(yīng)該優(yōu)先運(yùn)算的方向。結(jié)合性分為左結(jié)合性即運(yùn)算方向?yàn)樽宰笾劣?,和右結(jié)合性即運(yùn)算方向?yàn)樽杂抑磷蟆?/p>
具體規(guī)則可查閱表一。這就要求,學(xué)生能夠像熟練掌握運(yùn)算符的優(yōu)先級一樣,要牢記每個運(yùn)算符的結(jié)合性。
2)結(jié)合性應(yīng)用舉例:
例2,如a、b、c、d均為整型變量,求表達(dá)式a=b=c=d=3的值。
根據(jù)運(yùn)算符的結(jié)合性可知,運(yùn)算符的結(jié)合方向?yàn)樽杂蚁蜃螅兞抠x值過程如下,d=3,c=d,c=3,b=c,b=3,a=b,a=3。
3及時標(biāo)注變量值的變化
1)概念注釋:表達(dá)式中有賦值運(yùn)算符時,變量都會進(jìn)行初始化賦值。但是變量的值在運(yùn)算過程中是會發(fā)生變化的,每次運(yùn)算時,要看變量上一次結(jié)束后的最新值。如果一直用初始化的值,那么就會出錯了。
2)應(yīng)用舉例,
例3,已知b=10,求c語言表達(dá)式: b+=b-=b*b的值。
根據(jù)我們上面講到的運(yùn)算規(guī)則,
(1)考慮優(yōu)先級,先進(jìn)行b*b運(yùn)算,即b*b=10*10=100,表達(dá)式b+=b-=b*b變?yōu)閎+=b-=100。此時無變量值發(fā)生變化。
(2)考慮結(jié)合性:計(jì)算b+=b-=100,根據(jù)賦值運(yùn)算符結(jié)合性是自右向左,先執(zhí)行b-=100,相當(dāng)于b=b-100=10-100= -90,此時應(yīng)及時標(biāo)注變量變化,即b=-90,同時表達(dá)式b==b-= 100變?yōu)閎+=-90。再運(yùn)算b+= -90,相當(dāng)于b=b+(-90)=-90-90= -180。
在本步驟中可以注意到,變量的標(biāo)注其實(shí)是伴隨著優(yōu)先級和結(jié)合性使用過程當(dāng)中的,并不是單獨(dú)地存在于某一環(huán)節(jié)。
4合理使用輔助工具“括號”
1)概念注釋:雖然,我們知道在計(jì)算順序上可以利用優(yōu)先級和結(jié)合性判定c語言表達(dá)式的運(yùn)算方向。但有時候在計(jì)算的時候直觀性仍然很差。這時候我們可以在表達(dá)式中添加括號,來輔助我們清晰判斷程序的執(zhí)行方向和先后順序。
2)應(yīng)用舉例
例4,b+=b-=b*b+a,共有四個運(yùn)算符,我們根據(jù)運(yùn)算符的優(yōu)先級和結(jié)合性可以加括號如下:b+=(b-=((b*b)+a)),本表達(dá)式中共加了3個括號,第一個括號和第二個括號,是根據(jù)運(yùn)算符的優(yōu)先級,第三個括號是根據(jù)運(yùn)算符的結(jié)合性。3個括號的輔助,即讓c語言表達(dá)式的運(yùn)算次序和方向變得一目了然。
3)注意點(diǎn):括號的使用可以幫助我們理解表達(dá)式,切記括號的添加和使用不是隨意的,括號的使用不能改變原來的運(yùn)算次序和方向。
5含有邏輯運(yùn)算符的表達(dá)式的求值,及表達(dá)式中變量的求值
1)邏輯與運(yùn)算符的表達(dá)式。
如果表達(dá)式1&&表達(dá)式2,當(dāng)表達(dá)式1的值為0時,整個表達(dá)式運(yùn)算停止,不再對表達(dá)式2進(jìn)行運(yùn)算。如果表達(dá)式1的值為非0時,則要對表達(dá)式2進(jìn)行運(yùn)算。
(1)邏輯與“&&”運(yùn)算符左邊表達(dá)式為假。
例5,如定義:int a=0,b=2。語句1 為:a++&&b++,求語句1的值及執(zhí)行語句1后a和b的值。
解:執(zhí)行語句1,先判斷a++是否為0,由于a為0,所以a++為0,則邏輯表達(dá)式a++&&b++的值為0,表達(dá)式運(yùn)算停止,不再執(zhí)行&&運(yùn)算右邊b++的運(yùn)算。在判斷a是否為非0后,a的值自增1。所以語句1執(zhí)行后,表達(dá)式的值為0。同時a=1,b=2。
(2)邏輯與“&&”運(yùn)算符左邊表達(dá)式為真。
例6,如定義:int a=1,b=2;
a++&&b++;
求表達(dá)式a++&&b++的值,及執(zhí)行該表達(dá)式后a和b的值。
解:執(zhí)行表達(dá)式a++&&b++,先判斷a是否為0,由于a為非0值1,所以a++為非0。故判斷b是否為非0,b為非0,所以整個表達(dá)式的值為真。在判斷a是否為非0后,a的值自增1,同理,在判斷b是否為非零后,b自增1,所以,表達(dá)式執(zhí)行完畢后,a=2,b=3。
由此可見,邏輯與表達(dá)式的運(yùn)算,如果“&&”運(yùn)算符左邊表達(dá)式為0,則不執(zhí)行邏輯與運(yùn)算,運(yùn)算停止,邏輯與表達(dá)式的值為假;如果“&&”運(yùn)算符左邊表達(dá)式為非0,則執(zhí)行邏輯與運(yùn)算,表達(dá)式的結(jié)果由右邊表達(dá)式的值決定,右邊表達(dá)式的結(jié)果為0,整個表達(dá)式為假,右邊表達(dá)式的值為非0,整個表達(dá)式的結(jié)果為真。
2)邏輯或表達(dá)式的運(yùn)算。
如果表達(dá)式1||表達(dá)式2,當(dāng)表達(dá)式1的值為非0時,表達(dá)式停止運(yùn)算;如果表達(dá)式1的值為0時,則繼續(xù)執(zhí)行邏輯或運(yùn)算。
例7,已知a=1,b=1;
++a||++b;
求表達(dá)式++a||++b的值,及執(zhí)行后a、b的值。
解:執(zhí)行表達(dá)式++a||++b,根據(jù)邏輯或結(jié)合性是自左向右,所以先判斷++ a的值,由于++a的值為非0,所以表達(dá)式的值為真,整個表達(dá)式停止運(yùn)算。在判斷++a是否為0后,a自增1。所以表達(dá)式執(zhí)行結(jié)束后,a=2,b=1。
3)邏輯或與邏輯與的混合表達(dá)式。
(1)這時候要先判斷邏輯或運(yùn)算符左邊表達(dá)式的結(jié)果,不一定先進(jìn)行與運(yùn)算。
例8,已知,int ?a=1,b=1,c=1;
++a||++b&&++c;
求表達(dá)式++a||++b&&++c的值,及執(zhí)行該表達(dá)式后a、b、c的值。
解:執(zhí)行表達(dá)式++a||++b&&++c,先判斷++a的值,由于++a的值為非0,所以表達(dá)式的值為真,整個表達(dá)式停止運(yùn)算。這時候不再執(zhí)行“||”右邊的表達(dá)式“++b&&++c”的運(yùn)算。在判斷++a是否為0后,a自增1。故表達(dá)式執(zhí)行結(jié)束后,a=2,b=1,c=1。
(2)邏輯或“||”運(yùn)算符的左邊表達(dá)式為假,先執(zhí)行邏輯與運(yùn)算。
例9,已知,int ?a=0,b=1,c=1;
a++||++b&&++c;
求表達(dá)式a++||++b&&++c的值,及執(zhí)行該表達(dá)式后a、b、c的值。
解:先判斷a是否為0,由于a為0,則執(zhí)行++b&&++c,判斷++b不為0,執(zhí)行與運(yùn)算,因?yàn)?+c不為0,所以邏輯與表達(dá)式為真,所以表達(dá)式a++||++b&&++c為真。同理,在執(zhí)行完整個語句后,a=1,b=2,c=2。
從上面的實(shí)例中可以總結(jié)出:邏輯表達(dá)式運(yùn)算時,最重要的一點(diǎn)是判斷邏輯表達(dá)式什么時候停止運(yùn)算,什么時候執(zhí)行運(yùn)算。并通過執(zhí)行過程,可以判斷出變量的值是否改變。
C語言學(xué)習(xí)者,只要在掌握c語言各類運(yùn)算符的優(yōu)先級和結(jié)合性基礎(chǔ)上,參照本篇文章所講的五個要素,多練習(xí),多思考,多總結(jié),就能夠準(zhǔn)確地解決各種復(fù)雜的C語言表達(dá)式的運(yùn)算。而以扎實(shí)的基礎(chǔ),輕松跨入C語言下一階段的學(xué)習(xí)。
參考文獻(xiàn):
[1] 李紅衛(wèi),李秉璋.C程序設(shè)計(jì)與訓(xùn)練[M].3版. 大連理工大學(xué)出版社,2014.
[2] 譚浩強(qiáng).C程序設(shè)計(jì)[M].5版. 北京: 清華大學(xué)出版社, 2017.
[3] C/C++語言中的復(fù)合自增自減運(yùn)算規(guī)則探究[J].電腦編程技巧與維護(hù),2019(9):47-49.
[4] 基于省級創(chuàng)新訓(xùn)練平臺的“C語言程序設(shè)計(jì)”教學(xué)改革與實(shí)踐[J].科教導(dǎo)刊,2017(22):115-116.
[5] 李海豐,李俊生,謝麗霞,等."三位一體"的C語言程序設(shè)計(jì)課程教學(xué)改革實(shí)踐[J].計(jì)算機(jī)時代,2019(11):93-95.
【通聯(lián)編輯:唐一東】