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

C語言學習常見誤區探析

2020-07-07 07:48:10楊存偉汪維清
鄂州大學學報 2020年2期
關鍵詞:程序

楊存偉,汪維清

(西南大學 信息管理系,重慶 402460)

計算機相關專業學生的第一門編程語言往往是C語言,作為一門高級語言,有一定的抽象性。未接觸過計算機科學的初學者,往往會因為各種原因形成一些理念誤區,學習理念出錯會導致事倍功半,使初學者喪失學習興趣。

1 認為僅學習C語言可以理解計算機底層原理

C語言具有一定的抽象性,初學者在學習C語言大多無編程經驗,C語言教材往往會較為抽象地介紹C語言,而不具體講解涉及的底層原理,因為這更有助于初學者編程入門。

例一:以一個C語言版本的以遞歸方法尋找兩個正整數最大公約數的程序為例[1]:

數組,函數,判斷語句等基本語法在常見的編程語言中都有,相對不那么“底層”的Python,C#,Java等都可實現這個算法,與編程語言的種類關系較小。

很多C語言的資料講到,arr是一個指針,它保存內存的一個地址,通過此地址可訪問內存中一個int型數據,誤操作指針會導致程序錯誤甚至系統崩潰[2]。初學者往往理解為arr保存的是物理地址,雖不影響程序實現,但并不準確。

以32位的使用NT內核的Windows為例,在Windows中,每個進程都有自己的虛擬地址空間(0x00000000~0xFFFFFFFF),指針arr保存了虛擬地址空間的地址,而非物理內存地址。指針arr所指向的數據可能存儲在物理內存中,可能在硬盤上(由于Windows虛擬內存技術),也可能在其他地方[3]。

誤操作指針可以導致系統崩潰或硬件損壞,但是初學者編寫的此類簡單控制臺程序很難導致系統崩潰或硬件損壞,相對來說,編寫Windows內核模式驅動程序,單片機控制程序這樣的偏底層的程序才易因指針問題出現嚴重錯誤。操作系統中進程之間相對獨立,在Windows操作系統中,一個進程若需要訪問另一個進程的數據,可以調用Write Process Memory函數、使用DLL注入技術、創建內存文件映射對象共享數據等,而一個簡單的指針問題很難辦到。

以上涉及到計算機組成原理,操作系統原理中的知識,只學習C語言本身,即使屏蔽掉這些知識,也可以做到寫出有一定復雜度的程序。初學者較難理解的概念,如函數指針,共用體,可以用抽象的方式理解,學習計算機科學可以是從頂層向底層和從底層向頂層相結合的。

例二:直接調用Windows API編寫窗體程序的代碼片段

對于初學者來說,宏定義的用法,函數的編寫方法,switch語句的使用等并不困難,上述代碼沒有涉及不常見的語法,但初學者并不容易理解,Windows API編寫窗體程序涉及到很多Windows操作系統的知識。

由以上兩例可以看出,僅憑C語言的學習,不能理解計算機的底層原理。作為一種高級語言,能夠提供的抽象程度可以允許一定范圍內忽略硬件及操作系統之類的細節而編寫程序,所以對于初學者來說不管學習Python,Java,C#還是C語言,都不會直接了解底層的原理,C語言只是相對來說能更好的引申出這些知識而已。

2 編寫代碼過于復雜

源代碼應是方便程序員閱讀和修改的,越復雜,通常越難以維護,更容易出錯。在不影響程序的最終實現效果(比如不用位運算就會嚴重拖慢運行速度)的前提下,應該使代碼更通俗易懂。但是,初學者往往會“炫耀”技巧,使得代碼過于復雜、艱澀。

2.1 濫用技巧

例三:交換兩個變量的值

不考慮int的表示范圍以上代碼是沒有問題的,但若*x+*y?[INT_MIN,INT_MAX]會溢出,這個函數便不能交換兩變量的值。而更易懂的寫法應該引入第三個變量進行交換。

2.2 表達思路不清晰

例四:“HelloWorld!”轉化成大寫輸出

這個程序的目的是將一串字符轉化成大寫輸出,在禁用編譯器優化的情況下,可能會調用很多次strlen函數。而且并非需要每次都調用printf函數,可將其存入一個字符數組后一次性輸出。較合理的寫法如下:

2.3 濫用不常用的特性

以下將C語言的庫函數,語法等,統一稱作C語言的特性。C語言教材的第一示例程序通常都是一個簡單的”Hello World”,然后逐漸介紹新的特性,并要求讀者在程序中使用,會讓部分讀者有“學到新特性就要盡可能在程序中使用”的習慣,使用常用的,被大多數編譯器支持的特性是正常的,而不常用的,只被很少編譯器支持的特性,如_Generic關鍵字,_Noreturn函數標記,_Atomic類型修飾符和頭文件等,只有在需要使用并了解風險(可移植性,易讀性,編譯器是否完整支持)時才應使用[4]。

如在判斷正整數的奇偶性,判斷整數的符號是否相同時,不應總是使用位運算[5];有兩個有關聯的數據應該使用結構體而不是利用C99標準中定義的復數的實部和虛部進行表示;在不需要特別注意內存占用或沒有其他特殊需求時不使用“位域”等。

3 不注意undefined behavior(未定義行為)

例五:C語言源代碼

頭文件限定了特定平臺上int的表示范圍,而顯然INT_MAX+1超出了這一范圍。C語言標準沒有規定應該接下來會發生什么,調用函數可能返回一個不可預見的值、程序崩潰、刪除磁盤上的某些文件等,出現任何結果編譯器都未違反C語言標準。在DOS上,在Windows 10上,在FreeBSD上,由于運行環境和編譯器的實現方式不同,結果難以預測,故即使在某一個平臺上利用反匯編的手段,也不能判定其他環境的結果。任何試題和教材都不應該嘗試去判定這種語法現象一定會出現什么情況。未定義行為沒有明確的含義,因此也是錯誤的代碼,但是C語言標準不要求編譯器報錯或者給出警告[6]。

例六:求出a,b的值:

使用Visual C++6.0編譯,a,b分別為30和37,在更老的Turbo C 3.0中,a,b分別為30和39。這一歧義與序列點(sequence point)有關。”a=(i++)+(i++)+(i++);”這樣的表達式沒有任何實際意義,是錯誤的[7]。

除此之外,不確定行為(unspecified behavior),實現定義行為 (implementation-defined behavior)等也可能給程序造成意外的結果。

4 過于急切學習編寫GUI程序

在PC、智能手機等設備上,接觸最多的是圖形化的界面,普通用戶很少使用命令行界面,初學者總想早一些能編寫出來他們所熟悉的GUI程序,但編寫程序,學習計算機科學,不等于編寫GUI程序。一些初學者學習了C語言以及計算機其他課程之后依然只能寫出“黑框框”程序,十分焦躁。并非編寫GUI程序就一定有技術含量,而編寫算法程序,學習計算機網絡原理,理解操作系統原理這些與GUI關系不大的就沒有技術含量。編寫GUI程序有各種成熟的解決方案,如Windows平臺上的WPF技術、Java的JavaFX技術、Python的Tkinter模塊等,使用這些技術編寫簡單的GUI程序是十分容易的,而計算機相關專業的學生應該將精力放在計算機組成原理、計算機網絡、數據結構、操作系統、編譯原理等核心內容上,浮于表面的學習很難對整個計算機科學有清晰的認知,更難在計算機行業有所發展。

5 結語

(1)對于C語言初學者來說,寫出各種不良或者錯誤的代碼是很正常的,但是如果學習理念有誤區,就應當及時糾正。有些初學者在反復糾結“a+=a-=a*a;”這種錯誤的,意義不明的代碼,有些初學者迷戀各種似是而非的技巧,有些初學者想“學完”C語言(指的是,掌握所有特性)……這些都是不正確的理念,無助于培養計算機科學的思維習慣。

(2)C語言可以認為簡單,因為語法簡單,沒有像C++那么多的關鍵字和語法;但C語言也很難,語法簡單,一些語義很難理解,而理解這些語義,不是靠背語法、程序代碼可以解決的。

(3)學習計算機科學需要正反饋,可以自頂層向底層和從底層向頂層相結合的方式學習,而不應該總是線性的,從“Hello World”到學習聯合體,函數指針這種高級特性,應逐漸的加入操作系統、計算機組成原理等其他知識,一步步加深一些語言特性的理解,同時也促進其他理論的學習。

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
基于VMM的程序行為異常檢測
偵查實驗批準程序初探
我國刑事速裁程序的構建
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 国产午夜人做人免费视频| 伊人久久久久久久| 国产91线观看| 欧美一区二区精品久久久| 亚洲无码91视频| 国产成人a在线观看视频| 亚洲开心婷婷中文字幕| 婷婷久久综合九色综合88| 亚洲精品天堂自在久久77| 久久99热这里只有精品免费看 | 欧美日韩一区二区在线免费观看| 亚洲国产日韩在线观看| 在线亚洲精品自拍| 亚洲天堂色色人体| 人禽伦免费交视频网页播放| 欧美日韩在线国产| 午夜人性色福利无码视频在线观看| 国产精品久久自在自线观看| 色综合网址| 国产精女同一区二区三区久| 久久综合亚洲色一区二区三区| 国产成人精品综合| 亚洲精品777| 国产va免费精品观看| 91精品专区国产盗摄| 乱系列中文字幕在线视频| 国产成人福利在线视老湿机| 精品国产91爱| 国产精品护士| 久久精品人人做人人爽电影蜜月 | 欧美性久久久久| 五月六月伊人狠狠丁香网| 欧美国产日韩在线播放| 国产一区二区色淫影院| 国产欧美高清| 视频二区国产精品职场同事| av天堂最新版在线| 91免费国产高清观看| 免费国产好深啊好涨好硬视频| 一级毛片网| 国产女人在线视频| 少妇极品熟妇人妻专区视频| 中文国产成人精品久久| 一级香蕉视频在线观看| 国产永久无码观看在线| 伊人丁香五月天久久综合| 毛片久久网站小视频| 亚洲天堂.com| 色婷婷亚洲十月十月色天| 少妇精品网站| 福利在线一区| 免费一级毛片在线播放傲雪网| 最新国产成人剧情在线播放| 无码人中文字幕| 久久中文字幕2021精品| 四虎永久免费在线| 国产成在线观看免费视频| 很黄的网站在线观看| 污网站免费在线观看| 久久精品国产免费观看频道| 亚洲中文字幕在线精品一区| 高清精品美女在线播放| 亚洲不卡av中文在线| 欧美视频在线观看第一页| 天天躁狠狠躁| 国产免费久久精品99re不卡| 国产另类乱子伦精品免费女| 伊人久综合| 久久免费观看视频| 老司机aⅴ在线精品导航| 婷婷综合亚洲| 久久这里只有精品23| 日韩精品一区二区深田咏美| 97国产精品视频自在拍| 国产主播一区二区三区| 久久久久免费看成人影片| 日本不卡视频在线| 日韩毛片免费| 国产精品亚洲专区一区| 国产成人一区| 美女国产在线| 日韩精品毛片|