亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        準確使用C/C++中等于運算符的研究

        2016-11-28 03:10:55張合花張全法齊永奇
        中州大學學報 2016年2期
        關(guān)鍵詞:浮點數(shù)運算符程序員

        張合花,張全法,齊永奇

        (1.鄭州大學 物理工程學院,鄭州 450001;2.華北水利水電大學 機械學院,鄭州 450045)

        ?

        準確使用C/C++中等于運算符的研究

        張合花1,張全法1,齊永奇2

        (1.鄭州大學 物理工程學院,鄭州 450001;2.華北水利水電大學 機械學院,鄭州 450045)

        本文討論C/C++程序設計中等于運算符的兩種常見使用錯誤,即與賦值運算符混淆和用來判別兩個浮點數(shù)是否相等。從程序員的角度給出了減少與賦值運算符混淆,以及不同情況下正確判別兩個浮點數(shù)是否相等的方法。并利用VC 6.0設計了一個Add-in程序,能夠自動發(fā)現(xiàn)有可能出現(xiàn)這兩種錯誤的語句,提醒程序員注意,以便從集成開發(fā)環(huán)境的角度減少錯誤。

        C/C++程序設計;等于運算符;Add-in

        《C語言程序設計》是大多數(shù)高校開設的第一門計算機語言課程,《C++語言程序設計》則是許多高校開設的計算機語言進階課程,同時C/C++也是廣大工程技術(shù)人員最常用的程序設計語言之一。然而C/C++程序設計的靈活性也帶來了一些負面影響,即容易出現(xiàn)各種各樣的錯誤,其中就有等于運算符使用不慎造成的。

        等于運算符也稱為相等運算符,用來判別兩個操作數(shù)是否相等。它由“==”構(gòu)成,很容易與由“=”構(gòu)成的賦值運算符混淆(以下簡稱為混淆錯誤),這在很多文獻中有論述[1-4]。另外它還常被用來判別兩個浮點數(shù)是否相等(以下簡稱為浮點數(shù)錯誤),導致運行結(jié)果不一定正確,例如文獻[5]和文獻[6]中的例程就出現(xiàn)了這種錯誤。本文主要研究在編程中如何盡量避免出現(xiàn)這兩種錯誤。

        1 問題的引入

        假設有這樣一個數(shù)學問題:在平面直角坐標系Oxy中有4個點A、B、C、D,各點的坐標值如圖1所示,問C、D兩點是否位于A、B兩點所決定的直線上?在數(shù)學上很容易求得通過A、B兩點的直線方程,進而知道C點在直線上而D點不在直線上。

        為了利用計算機求解,用VC 6.0新建控制臺類型的空白項目,項目名為Test。向其中添加名字為Test.cpp的源文件,文件內(nèi)容如下:

        圖1 平面直角坐標系中的點

        #include

        void main(){

        float xA=0.0f,yA=0.04f;

        float xB=0.01f,yB=0.03f;

        float xC=0.005f,yC=0.035f;

        float xD=0.02f,yD=0.04f;

        float y=(xC-xB)*(yA-yB)/(xA-xB)+yB;

        if(y==yC)

        cout<<"C is on line."<

        else

        cout<<"C is not on line."<

        y=(xD-xB)*(yA-yB)/(xA-xB)+yB;

        if(y=yD)

        cout<<"D is on line."<

        else

        cout<<"D is not on line."<

        以上程序在編譯、鏈接時均沒有任何錯誤或警告。運行程序,輸出為:

        C is on line.

        D is on line.

        從運行結(jié)果看,對C點的判別是正確的,對D點的判別是錯誤的。針對錯誤的運行結(jié)果對程序進行分析可以發(fā)現(xiàn),在第2個if語句的判斷表達式中誤將等于運算符寫成了賦值運算符。這使得只要其右操作數(shù)不為0,均執(zhí)行if子句而不執(zhí)行else子句。

        改正之后再運行程序,輸出為:

        C is on line.

        D is not on line.

        此時對C、D兩點的判別均是正確的,好像程序沒有問題了。其實不然,只要將程序中各數(shù)據(jù)的小數(shù)點向后移一位,輸出將變?yōu)椋?/p>

        C is not on line.

        D is not on line.

        對C點的判別不再正確。

        為什么運行結(jié)果會變得不再正確呢?原因在于浮點數(shù)在計算機中通常只能近似表示,即使兩個在數(shù)學上應該相等的浮點數(shù),在計算機中經(jīng)過計算也很可能不相等。因此,用等于運算符判別兩個浮點數(shù)是否相等很可能得不到正確結(jié)果。這種錯誤比混淆錯誤更加隱晦,很難在調(diào)試過程中被發(fā)現(xiàn),所以減少這種錯誤的迫切性更強烈。

        2 主動減少錯誤的方法

        2.1 減少混淆錯誤的方法

        作為程序員,首先要認識到判別兩個操作數(shù)是否相等應該用兩個等號而不是一個等號。其次,在編輯程序時應該時刻保持警惕,不要因為連續(xù)擊鍵不到位等原因而漏掉兩個等號中的一個。為了進一步減少這種錯誤,在條件允許的情況下應該盡量將非左值表達式(例如常量)放到等于運算符的左側(cè)。因為此時一旦誤用了賦值運算符,編譯器會報告錯誤。

        2.2 減少浮點數(shù)錯誤的方法

        作為程序員,首先要認識到用等于運算符判別兩個浮點數(shù)是否相等可能得到錯誤的結(jié)果。其次還要知道遇到此類問題該如何處理。由于浮點數(shù)在計算機中只能近似表示,無法判別兩個浮點數(shù)是否嚴格相等,凡是判別兩個浮點數(shù)是否相等的問題通常只能轉(zhuǎn)化為判別它們是否近似相等。但是C/C++中沒有近似相等運算符。為此,可以根據(jù)具體問題設置一個小量,當兩個浮點數(shù)之差的絕對值小于該小量時認為二者近似相等[7]。如果需要對浮點數(shù)進行其他關(guān)系運算,也需要進行類似的處理,否則可能得不到正確結(jié)果。

        對于以上經(jīng)過修改的程序,再把“if(y==yC)”和 “if(y==yD)”分別修改為“if(fabs(y-yC)<1.0e-6)”和“if(fabs(y-yD)<1.0e-6)”。由于此時需要調(diào)用庫函數(shù)fabs(),還應該在程序前面包含頭文件math.h。再運行程序,輸出為:

        C is on line.

        D is not on line.

        結(jié)果正確。即使將數(shù)據(jù)恢復到移動小數(shù)點之前,結(jié)果依然正確。

        對于某些問題,如果能夠轉(zhuǎn)化為整數(shù)運算,則仍然可以使用等于運算符。例如文獻[5]和文獻[6]的例程中,如果將對灰度值出現(xiàn)概率的求和修改為對灰度值出現(xiàn)次數(shù)的求和,再利用等于運算符判別求和結(jié)果是否等于灰度值出現(xiàn)的總次數(shù),將可以避免處理某些圖像時陷入死循環(huán)。

        3 利用Add-in減少錯誤

        3.1 必要性和可行性

        編程知識和經(jīng)驗不夠豐富的程序員不具備主動防范上述錯誤的能力。即使編程知識和經(jīng)驗很豐富的程序員也難以通過主動防范杜絕上述錯誤。而僅根據(jù)調(diào)試結(jié)果又不太容易發(fā)現(xiàn)上述錯誤,因為有時候運行結(jié)果沒有錯誤,或者因調(diào)試不完備導致存在錯誤的語句沒有被執(zhí)行。顯然,如果能夠設法讓集成開發(fā)環(huán)境自動發(fā)現(xiàn)上述錯誤并發(fā)出警告,將非常有利于避免上述錯誤的發(fā)生。

        目前,在高校和企業(yè)中廣泛使用VC 6.0集成開發(fā)環(huán)境作為C/C++的教學和研發(fā)平臺。它可以外掛Add-in對正在開發(fā)的程序進行分析,查找可能出現(xiàn)的問題。Add-in已經(jīng)被成功地用來減少重復聲明復合類型的風險[8]、使用goto語句的錯誤[9]以及使用后置自增自減運算符的非預期結(jié)果[10]。因此,設計一個能夠自動查找等于運算符使用錯誤的Add-in是可行的。

        3.2 查找錯誤的原理和困難

        查找錯誤的原理很簡單。對于在程序中查找到的每一個賦值運算符,如果能夠推斷該處應該使用等于運算符則說明該處出現(xiàn)了混淆錯誤,否則該處沒有錯誤。對于在程序中查找到的每一個等于運算符,如果能夠推斷它作用在浮點數(shù)上,則說明該處出現(xiàn)了浮點數(shù)錯誤,否則該處沒有錯誤。按照此原理可以避免對于上述兩種錯誤的漏報。

        困難在于如何準確地進行推斷。由于在Add-in中無法知道程序所描述的實際問題,很難推斷賦值運算符是否應該為等于運算符。推斷等于運算符操作數(shù)的類型也很不容易,因為其操作數(shù)可以是各種各樣的表達式,甚至可以沒有類型,例如宏形參。即使其操作數(shù)為變量也不容易推斷其類型,因為變量類型的聲明可能不在本文件中,例如在包含文件中,包含文件還可以嵌套;內(nèi)層變量的類型可以與外層同名變量的類型不同等等。

        3.3 解決問題的辦法

        如上所述,在Add-in中很難推斷是否一定產(chǎn)生了錯誤,然而程序員對程序所描述的問題是清楚的。因此,將可能出現(xiàn)錯誤的位置及可能的錯誤類型報告給程序員去判斷,可以得到準確的結(jié)果并由其采取正確的措施。但是這又會帶來新的問題。等于運算符使用得比較少,即使將所有使用它的地方報告給程序員,誤報量也不大。但是如果將所有使用賦值運算符的地方報告給程序員,必將產(chǎn)生大量誤報,因為賦值運算是一種很常見的運算。

        可以根據(jù)等于運算符的屬性減少誤報。等于運算符屬于關(guān)系運算符,最有可能出現(xiàn)的地方首先是if語句的判斷條件表達式,其次是條件運算符的判斷條件表達式,然后是for、while和do…while語句的循環(huán)條件表達式。而這些地方使用賦值運算符的可能性是比較低的。僅在這些地方尋找賦值運算符并報告給程序員可以減少誤報。不過這樣做有可能出現(xiàn)漏報,因為等于運算符允許出現(xiàn)在這些地方之外。

        3.4 Add-in的開發(fā)

        有關(guān)如何在VC 6.0中創(chuàng)建Add-in類型的項目、在Add-in的哪個函數(shù)中訪問項目文件、訪問項目文件之前應該做哪些準備工作、如何逐一訪問項目中的所有源文件和頭文件、如何在內(nèi)存中對各個文件的內(nèi)容進行簡化以及如何輸出警告信息等,可以參考文獻[8]~文獻[10]。下面僅簡單介紹一下查找可能存在錯誤之語句的位置及類型的方法步驟。

        (1)從文件開頭向后搜索“==”,一直到文件末尾。每搜索到一處,記錄正在分析的文件名、“==”所在的行號和問題類型。此時問題類型為“使用==”。

        (2)從文件開頭向后搜索“?”,一直到文件末尾。每搜索到一處,再從該處向前尋找最近的運算符。如果它為賦值運算符(注意等號未必是賦值運算符,下同,不再說明),記錄正在分析的文件名、“?”所在的行號和問題類型。此時問題類型為“?:中使用=”。

        (3)從文件開頭向后搜索“if”(注意防止它是其他標識符的一部分,下同,不再說明),一直到文件末尾。每搜索到一處,再從該處向后尋找最近且配對的左、右圓括號,并在其間搜索賦值運算符。如果搜索到了,記錄正在分析的文件名、“if”所在的行號和問題類型。此時問題類型為“if中使用=”。

        (4)從文件開頭向后搜索“for”,一直到文件末尾。每搜索到一處,再從該處向后尋找最近且配對的左、右圓括號,接著在其間尋找兩個“;”,并在這兩個“;”之間搜索賦值運算符。如果搜索到了,記錄正在分析的文件名、“for”所在的行號和問題類型。此時問題類型為“for中使用=”。

        (5)從文件開頭向后搜索“while”,一直到文件末尾。每搜索到一處,再從該處向后尋找最近且配對的左、右圓括號,并在其間搜索賦值運算符。如果搜索到了,記錄正在分析的文件名、“while”所在的行號和問題類型。此時問題類型取決于上述右圓括號后面的第一個非空白字符。如果它為“;”,則問題類型為“do…while中使用=”,否則為“while中使用=”。

        3.5 Add-in的運行結(jié)果

        Add-in開發(fā)好后,按照文獻[10]中所述方法使其外掛到VC 6.0中。然后重新打開上述Test項目,回退到未進行修改之前,再執(zhí)行Build菜單命令,將彈出如圖2所示的對話框,給出警告信息。經(jīng)過測試,證明了它在大多數(shù)情況下能夠發(fā)現(xiàn)等于運算符使用中可能存在的問題。

        圖2 發(fā)現(xiàn)問題時彈出的對話框

        4 結(jié)束語

        討論了C/C++中主動減少等于運算符使用錯誤的方法。開發(fā)的Add-in程序能夠自動尋找在VC 6.0中使用等于運算符時可能出現(xiàn)錯誤的地方,有助于程序員及時發(fā)現(xiàn)問題并采取正確措施,可以為廣大學生和工程技術(shù)人員學習、掌握及運用C/C++程序設計提供幫助。事實上,當開發(fā)的Add-in發(fā)現(xiàn)可能發(fā)生混淆錯誤的地方時,實際上有可能是其他類型的錯誤。例如由于擊鍵不到位,應該使用小于等于、大于等于或不等于運算符的地方變成了使用賦值運算符等。因此也可以減少出現(xiàn)這些錯誤的可能性。這可以算是所開發(fā)的Add-in的額外收獲。

        [1]譚浩強.C程序設計[M].4版.北京:清華大學出版社, 2010:359-360.

        [2]趙寶琴,袁志民.C/C++上機實驗中的典型錯誤[J].實驗室科學,2005(3):92-93.

        [3]萬權(quán)性,熊力維,李微.C語言常見錯誤原因分析及防范[J].福建電腦,2010(12):167-168.

        [4]劉偉,支聯(lián)合.C語言教學中遇到的問題及解決辦法[J].重慶科技學院學報:自然科學版,2009,11(2):136-138.

        [5]何斌,馬天予,王運堅,等.Visual C++數(shù)字圖像處理[M].2版.北京:人民郵電出版社,2002:583-594.

        [6]郎銳.數(shù)字圖像處理學——Visual C++實現(xiàn)[M].北京:北京希望電子出版社,2002:387-395.

        [7]周冠方.C語言中浮點數(shù)精度問題分析[J].湖北工業(yè)職業(yè)技術(shù)學院學報,2015,28(3):97-99.

        [8]張全法,齊永奇.用Add-in提高VC 6.0集成開發(fā)環(huán)境的查錯能力研究[J].中原工學院學報,2009,20(3):47-50.

        [9]張全法,陳倩.用Add-in減少VC 6.0中g(shù)oto語句使用錯誤的研究[J].中原工學院學報,2013,24(2):57-60.

        [10]張合花,齊永奇.減少后置自增自減運算符非預期結(jié)果的研究[J].中原工學院學報,2015,26(1):87-90.

        (責任編輯 趙冰)

        Study on Reducing Use Errors of Equality Operator in C/C++ Programming

        ZHANG He-hua1,ZHANG Quan-fa1,QI Yong-qi2

        (1.School of Physics and Engineering, Zhengzhou University, Zhengzhou 450001, China; 2.North China University of Water Resources and Electric Power, Zhengzhou 450045, China)

        Two kinds of common use errors of equality operator in C/C++ programming are discussed, one is to confuse with assignment operator and the other is to determine whether two floating point numbers are equal.For the programmers, some methods to reduce confusion with assignment operator and determine whether two floating point numbers are equal under different conditions are given.An Add-in is developed with VC 6.0 to find where maybe appear these kinds of errors and to notify the programmer to examine his program, thus to reduce the probability of errors from the perspective of the integrated development environment.

        C/C++ programming; equality operator; Add-in

        2015-12-21

        張合花(1970—),女,河南湯陰人,鄭州大學物理工程學院技師,主要研究方向為計算機信息處理。

        10.13783/j.cnki.cn41-1275/g4.2016.02.023

        TP311.52

        A

        1008-3715(2016)02-0112-04

        猜你喜歡
        浮點數(shù)運算符程序員
        為了讓媽媽看懂地圖,一位“野生程序員”做了個小程序
        消費電子(2022年7期)2022-10-31 06:17:10
        老祖?zhèn)魇诨具\算符
        科學24小時(2021年10期)2021-10-09 23:09:37
        四種Python均勻浮點數(shù)生成方法
        電腦報(2021年11期)2021-07-01 08:26:31
        怎樣成為一名優(yōu)秀程序員
        幼兒100(2020年29期)2020-10-21 06:17:58
        程序員之子
        意林(2017年24期)2018-01-02 22:49:14
        在C語言中雙精度浮點數(shù)線性化相等比較的研究
        非精確浮點數(shù)乘法器設計
        加班
        三月三(2016年6期)2016-06-21 10:25:33
        C++運算符重載剖析
        價值工程(2014年17期)2014-04-16 03:29:20
        表達式求值及符號推導
        99久久伊人精品综合观看| 免费看美女被靠到爽的视频| 97国产精品麻豆性色| 无码 制服 丝袜 国产 另类| 中文国产日韩欧美二视频| 无码小电影在线观看网站免费| 亚洲本色精品一区二区久久| 99精品欧美一区二区三区美图| 亚洲日韩中文字幕一区| 久久人妻av一区二区软件 | 精品亚洲一区二区三区在线观看| 久久精品人搡人妻人少妇 | 三级网址在线| 亚洲精品乱码久久久久久日本蜜臀 | 日本一区二区三区光视频| 免费人成黄页网站在线观看国产 | 中文少妇一区二区三区| 亚洲电影中文字幕| 亚洲av一宅男色影视| 人妻色综合网站| 精品欧美一区二区三区久久久| 一区二区三区日本视频| 人妻丝袜中文字幕久久| 国产精品爆乳在线播放| 人与嘼交av免费| 鲁一鲁一鲁一鲁一曰综合网| 国产av激情舒服刺激| 国产91极品身材白皙| 亚洲素人av在线观看| 亚洲欧美日韩精品高清| 久久久精品3d动漫一区二区三区| 色八a级在线观看| 久久久久久久综合综合狠狠| 亚洲中文字幕av天堂自拍| 亚洲男人的天堂av一区| 色妞一区二区三区免费视频| 亚洲色欲色欲欲www在线| 亚洲av无码成人网站www| 欧美老妇与禽交| 亚洲日韩v无码中文字幕| 我爱我色成人网|