|   初學者對于C語言中的誤區  時間:2016-12-13作者(zhe):華清遠見 1. 不能(neng)清(qing)晰理解(jie)"=="運(yun)算以及優先級和結核性的(de)含義(yi) 在判(pan)斷i,j,k三個變(bian)量是(shi)否相(xiang)等時往往會輕率地(di)寫出"i == j == k "這樣的表達式(shi)并誤以為(wei)(wei)三個變(bian)量的值相(xiang)等時,這個表達式(shi)的值為(wei)(wei)1。然而,這個是(shi)錯誤的。 在表達式"i== j == k "中,這兩個(ge)(ge)(ge)==符號(hao)的(de)優先(xian)級是(shi)相同的(de),這樣,我(wo)(wo)們要觀察表達式的(de)含義,需要借助結(jie)核性(xing)來(lai)判(pan)斷了(le)。"=="符號(hao)的(de)結(jie)合性(xing)是(shi)從左(zuo)到(dao)右(you),所以我(wo)(wo)們看到(dao)的(de)表達式"i== j == k "實際等(deng)價于"(i == j)== k"。我(wo)(wo)們分析這個(ge)(ge)(ge)表達式,其實這個(ge)(ge)(ge)式子的(de)含義是(shi)判(pan)斷(i == j)這個(ge)(ge)(ge)式子的(de)值與k的(de)值是(shi)否相等(deng)。 當k的(de)值(zhi)是(shi)(shi)1,而(er)i和j的(de)值(zhi)是(shi)(shi)相等并且都(dou)為(wei)(wei)1的(de)時(shi)(shi)候(hou),我(wo)們(men)(men)就會(hui)得到(dao)(dao)一個(ge)(ge)假象,以為(wei)(wei)這(zhe)(zhe)個(ge)(ge)表達(da)式(shi)是(shi)(shi)正(zheng)確的(de)。其實這(zhe)(zhe)個(ge)(ge)結果并不(bu)準確。只要k的(de)值(zhi)為(wei)(wei)1,i和j的(de)值(zhi)只要相同(tong),這(zhe)(zhe)個(ge)(ge)表達(da)式(shi)的(de)值(zhi)就為(wei)(wei)1 。而(er)對于i,j,k都(dou)為(wei)(wei)2的(de)時(shi)(shi)候(hou),我(wo)們(men)(men)反(fan)而(er)會(hui)得到(dao)(dao)表達(da)式(shi)不(bu)成立的(de)結果。從(cong)這(zhe)(zhe)幾個(ge)(ge)例子,我(wo)們(men)(men)能看出表達(da)式(shi)所表達(da)的(de)真實含(han)義。 2. 對于自然語言(yan)和程序語言(yan)的理解不一致。 看下面這個例子: "當一個整(zheng)數不(bu)(bu)等(deng)(deng)于(yu)5或者(zhe)不(bu)(bu)等(deng)(deng)于(yu)6時…….." 這句話(hua)我(wo)們按照正常的思(si)維理解,是沒有問題的,但是我(wo)們把這句話(hua)轉換(huan)為程序語(yu)言,就會出現問題了(le)。不信?那你試一(yi)試。 你是不是會這樣(yang)寫"if(i != 5 || i != 6)"?若是這樣(yang)寫,你就錯了(le)! 錯誤在于(yu)"i != 5 || i != 6 "這個表達(da)式的值是恒為(wei)1的。因(yin)為(wei)i的值不可能等于(yu)5的同時(shi)也等于(yu)6。所以,這個表達(da)式為(wei)假是不可能的。 實際上(shang),用準確(que)的(de)語言來描述這個問題是:當(dang)這個整數不等于(yu)5且不等于(yu)6時,程(cheng)序(xu)輸出1,否則(ze)輸出0。 3. 關(guan)于(yu)將自然(ran)語言翻譯(yi)成代(dai)碼,還有一個例(li)子值得(de)一說。如(ru)何將這句話(hua)翻譯(yi)為c代(dai)碼呢(ni)? "字(zi)符c的(de)值(zhi)等于''、'\n'或'\t' 有的(de)(de)同(tong)學講其翻譯為"c == '' || '\n' || '\t'"。然而,這(zhe)兩種描(miao)述(shu)并不(bu)(bu)等價,它們(men)的(de)(de)思考方式是不(bu)(bu)同(tong)的(de)(de)。在(zai)自然語言中成立(li)的(de)(de)語句,在(zai)C語言中并不(bu)(bu)一定成立(li)。 C語(yu)(yu)(yu)言是(shi)一種人(ren)與(yu)機器交流的(de)(de)語(yu)(yu)(yu)言,在(zai)某(mou)種程度(du)上,C語(yu)(yu)(yu)言更(geng)接近于數學語(yu)(yu)(yu)言。C語(yu)(yu)(yu)言中(zhong)的(de)(de)每(mei)個變量都有(you)值,C語(yu)(yu)(yu)言就是(shi)通過這(zhe)些值來實現邏輯表達的(de)(de)。在(zai)上面的(de)(de)例(li)子(zi)中(zhong),字(zi)符c的(de)(de)值是(shi)和''、'\n'或(huo)'\t'三者之(zhi)一是(shi)相等(deng)的(de)(de),也就是(shi)說,c == ''、c=='\n'、c == '\t'這(zhe)三個表達式(shi)有(you)且只有(you)一個為1。因此(ci),上述語(yu)(yu)(yu)句的(de)(de)C代碼可以寫成(c =='' + c == '\n' + c=='\t') == 1。 而更為有(you)效率的(de)(de)表達(da)(da)是(shi)這樣寫的(de)(de):c == '' || c == '\n' || c == '\t'。這種表達(da)(da)的(de)(de)優點是(shi),按照順序執行這三個表達(da)(da)式的(de)(de),若其(qi)中有(you)一個為1,就(jiu)不需(xu)要(yao)計算其(qi)余表達(da)(da)式,直(zhi)接得到表達(da)(da)式的(de)(de)值(zhi)。而(c =='' + c == '\n' + c=='\t') == 1表達(da)(da)式需(xu)要(yao)計算出所有(you)的(de)(de)式子的(de)(de)值(zhi),才能(neng)得到整個表達(da)(da)式的(de)(de)值(zhi)。 
 發表評論 
 |