白宗輝

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