999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

編譯原理視角下的C/C++語言左值教學

2013-04-12 00:00:00胡明曉
教育教學論壇 2013年15期

摘要:在C/C++語言的教學中,賦值語句通過賦值號“=”把左值和右值連接起來。能充當左值的語法單元是有限制的。如果學生不理解其中的限制條件往往會書寫錯誤的賦值語句。本文從編譯原理的值屬性和地址屬性出發分析左值的必要條件,學生通過簡單地觀察這些必要條件是否滿足來判定一個賦值語句的左值是否合法,從而使賦值語句和左值的教學方法簡明、到位。

關鍵詞:C/C++;教學方法;左值;編譯原理

中圖分類號:G642.4 文獻標志碼:A 文章編號:1674-9324(2013)15-0068-02

在計算機課程體系中,C/C++語言是一門基礎課程,它是許多計算機專業課程的先修課。在C/C++語言的教學中,賦值語句是最常見、最重要的語句了。學生在書寫這類語句時經常會出現編譯錯誤和運行錯誤,這些錯誤究其原因是學生對左值的概念沒有明晰的理解,它其實是編譯原理中的概念。在C/C++的教學中教師雖然不必對編譯原理的有關內容進行講解,但應當把左值的屬性講清楚,指出只有明確地址屬性的單元才能作為賦值語句的左值。這樣才能使學生徹底避免賦值語句的書寫錯誤,才能使賦值語句的教學簡明到位。

一、左值和賦值語句

C/C++的語句“a=b;”中的等號不同于數學中的等號,而是賦值號,數學中的等號具有對稱性,表示等號左邊和右邊兩個對象取值一樣,將左右兩個對象對調,不影響表達的意思,數學中的等式是靜態的描述,是陳述句。而C/C++語言中的賦值號“=”沒有對稱性,表示把“=”右邊的值賦給左邊的對象,左右對象不能對調,對調了就破壞了原意,甚至引發編譯致命錯誤(fatal error),賦值是動態過程,賦值語句是祈使句。所以有些語言干脆用LET或:=之類的符號表示賦值語句,以區分于數學里的等式。由于賦值語句的左右非對稱性,就產生了左值和右值的概念,這其實是編譯原理中的概念,在一個賦值語句中,被賦的對象叫賦值語句的左值(l-value),用于賦值的對象叫賦值語句的右值(r-value),它們分別出現在賦值號的左邊和右邊。C/C++語言的賦值語句的文法形式定義是:<賦值語句>→<左值>=<右值>。左值必須由具有內存地址的變量、數組元素等充當。右值則廣泛得多,任何表達式都可以。一個賦值語句的語義動作是:先把右值的值算出來,賦到左值所指定的某個地址處的內存單元,并覆蓋掉左值中原來的值。完整的賦值語句,只須右值能算出“值”來就行。但左值僅有“值”屬性是不行的,必須有明確的內存地址屬性。能充當左值的對象可充當右值,反之不一定。在C/C++中,除了簡單變量名之外,數組元素、結構體變量的成員、共用體變量的成員通常情況下也都可以作為左值,原因就是這些對象都具備地址屬性和明確的地址值,能把右值賦到這里。

二、案例分析

常量不能作為左值,語句“5=a;”錯誤,因為5只有值屬性,而無地址屬性,故不能作為左值。復雜表達式不能作為左值,如語句“a+b=5;”錯誤,賦值號左邊的“a+b”不是編譯符號,只有一個臨時值,不存在地址屬性。a++是賦值語句,相當于“a=a+1;”,a既是左值又是右值。所以不允許如下自加(自減)語句:3++;(a+b)--;++(a+3);數組名是常量,不能作為左值,若有short arr[10];arr表示一個短整型數組,它由10個元素組成,這10個元素順序排列,其地址依此遞增2字節,第i個元素用arr[i]或*(arr+i)表示,這些元素除了值屬性外,還具備地址屬性,可以作為左值,也就是說可以被賦值。數組名arr就不可以被賦值,因為一旦arr數組的空間分配了,arr作為首元素arr[0]的地址就確定了,是個常值,準確地說,arr是個地址常量,它只有值屬性(只不過這個常值是個內存地址值),它本身沒有地址屬性。數組名作為函數的形式參數時,情況有點特殊。看代碼段:

fun(int a[ ],int n)

{while(n--)

{printf(\"%d \", *a);

a++;

}

}

a是數組名,但其中的賦值語句“a++;”合法。實際上,C/C++編譯都是將形參數組名作為指針變量來處理的。上面給出的函數fun的形參a寫成數組形式,但在編譯時是將a按指針變量處理的,相當于fun函數的首行寫成fun(int*a,int n),這樣一來,語句“a++;”的合法性就有了,a在函數fun的實現代碼中可以作為左值。對多維數組要小心,假設有二維數組char b[3][5];b、b[1]不能作為左值,b[1][3]或*(b[1]+3)才可以作為左值。原因是b表示該二維數組第0行b[0]的行地址,b[1]表示第1行第0列元素b[1][0]的地址,它們都是地址常量,有值屬性,無地址屬性,故不能作為左值。b[1][3]或*(b[1]+3)表示第1行第3列的字符型元素,既有值屬性又有地址屬性,可以作為左值。一般地,對m維的數組type array[n1][n2]…[nm];array、array[i1]、……、array[i1][i2]…[im-1]都不能作為左值,只有array[i1][i2]…[im]才可作為左值。

C語言中函數返回值不能作為左值,如“f(x)=6;”是錯誤的C語句,C語言的函數調用結果只能賦給別的變量,不能讓別的表達式賦值給它。到了C++,允許這種情形出現,但前提是該函數的返回類型必須是引用型。看如下程序:

double a[10];

double fun(int i)

{return a[i];

}

void main()

{fun(0)=3.14159;

}

語句“fun(0)=3.14159;”中fun(0)作為左值出現了!fun(i)返回的是數組元素a[i]的引用,該語句的作用是把3.14159賦給全局雙精度實型數組a的首元素a[0]。

總之,判斷一個單元是否為合法的左值的準則是,該單元必須具有地址屬性并且具有明確的地址。最后看下面的語句,通過上述判斷準則,能非常簡單地判斷出其中的三個賦值語句都是錯誤的。

int a8[10]={1,2,……,10};

int *a9;

int a10;

a8 =a8+1; //賦值語句1

*a9=123; //賦值語句2

a10=a8[2];//賦值語句3

“a8=a8+1;”錯在a8是數組名,屬于常量,無地址屬性。“*a9=123;”中*a9雖有地址屬性,但其地址值還不明確,暫時不能作為左值,只有當指針a9有所指后(比如通過語句“a9=a8[3];”),該語句就正確了。“a10=a8[2];”中的a10有地址屬性和值屬性,但取地址后的a10只是個地址常量,只有值屬性而無地址屬性,故不能作為左值。通過這個判斷準則,學生能很容易地辨別合法的左值了。

通過編譯原理的概念導出C/C++的左值和賦值語句的簡明、精準的教學方法,由于從本質上點明了左值的屬性,從而使學生建立了非常清晰準確的賦值語句和左值的概念。這一教學方法的成功實踐從另一方面也說明了教師在教學過程中厚積薄發的重要性,借助于深層概念的外部表現來闡述簡單問題,能使教學效果得到明顯的提高。

參考文獻:

[1]荊淑霞,賈振華.在計算機語言教學中滲透“工程”思想[J].華北航天工業學院學報,2002,12(2):25-27.

[2]麥琪琳.教育心理學在計算機C語言教學中的應用分析[J].現代商貿工業,2007,19(9):192-193.

[3]Andrew K Lui;Reggie Kwan;Maria Poon;Yannie H.Y.Cheung.Saving weak programming students:applying constructivism in a first programming course[C].ACM SIGCSE Bulletin,2004,Vol 36,Issue 2:72-76.

[4]鄭莉,董淵,何江舟.C++語言程序設計[M].第4版.北京:清華大學出版社,2010.

主站蜘蛛池模板: 91丝袜在线观看| 五月天婷婷网亚洲综合在线| 91美女视频在线| 精品少妇人妻无码久久| 免费大黄网站在线观看| 99ri国产在线| 91成人在线观看| 在线免费不卡视频| 亚洲最大福利网站| 天天做天天爱夜夜爽毛片毛片| 性色一区| 精品三级网站| 亚洲AV无码久久精品色欲| 成人免费一级片| 国产欧美日韩精品第二区| 成人免费午夜视频| 九色视频最新网址| 午夜精品区| 久久窝窝国产精品午夜看片| 国产在线精品网址你懂的| 亚洲伊人电影| 五月天天天色| 亚洲综合色吧| 狠狠亚洲五月天| 亚洲va欧美ⅴa国产va影院| 亚洲免费人成影院| 一级毛片免费播放视频| 性喷潮久久久久久久久| 久久先锋资源| 老司机午夜精品网站在线观看| 91探花国产综合在线精品| 欧美午夜在线观看| 91在线播放免费不卡无毒| 日韩欧美91| 成人国产小视频| 国产一区二区三区精品久久呦| 国产特级毛片| 人妻21p大胆| 日韩av无码精品专区| 国产精品综合色区在线观看| 精品剧情v国产在线观看| 色欲不卡无码一区二区| 亚洲AV成人一区二区三区AV| 国产日本欧美在线观看| 久久一级电影| 婷婷午夜影院| 国产精品9| 国产极品粉嫩小泬免费看| 好久久免费视频高清| 67194亚洲无码| 99在线观看精品视频| 亚洲AV无码久久精品色欲| 亚洲精品中文字幕午夜| 国产精品女同一区三区五区| 九九九久久国产精品| 国产呦精品一区二区三区下载 | 国产精品视频999| 一区二区自拍| 欧美三級片黃色三級片黃色1| 精品人妻一区二区三区蜜桃AⅤ| 亚洲VA中文字幕| 26uuu国产精品视频| 久久国语对白| 思思热精品在线8| 精品五夜婷香蕉国产线看观看| 尤物成AV人片在线观看| 欧美色视频日本| 国产高清不卡| 一级做a爰片久久免费| 丰满人妻被猛烈进入无码| 久久国产V一级毛多内射| av一区二区无码在线| 国产剧情一区二区| 日韩欧美视频第一区在线观看| 五月天综合网亚洲综合天堂网| 欧美另类图片视频无弹跳第一页| 青青草国产在线视频| 国产91精品调教在线播放| 亚洲精品大秀视频| 一级毛片高清| 1024国产在线| 中文字幕欧美日韩|