58 C 賦值比較可能犯的錯誤

2021-08-27 16:13:28 字數 1506 閱讀 1556

不要混淆等於運算子(= =)與賦值運算子(=)。下面的表示式問了乙個**問題——musicians是否等於4?

musicians == 4

該表示式的值為true或false。下面的表示式將4賦給musicians :

musicians = 4;

在這裡,整個表示式的值為4,因為該表示式左邊的值為4。

for迴圈的靈活設計讓使用者很容易出錯。如果不小心洩漏了==運算子中的乙個等號,則for迴圈的測試部分將是乙個賦值表示式,而不是關係表示式,因此**仍是有效的。這是因為可能將任何有效的c++表示式用作for迴圈的測試條件。別忘了,非零值為true,零值為false。將4賦給musicians的表示式的值為4,因此被視為true。如果以前使用過用=判斷是否相等的語言,如pascal或basic,則尤其可能出現這樣的錯誤。

下列程式指出了可能出現這種錯誤的情況。該程式試圖檢查乙個儲存了測驗成績的陣列,在遇到第乙個不為20的成績時停止。該程式首先演示了乙個正確進行的迴圈,然後是乙個在測試條件中錯誤地使用了賦值運算子的迴圈。該程式還有另乙個重大的設計錯誤,稍後將介紹如何修復(應從錯誤中吸取教訓,而程式在這方面很有幫助)。

vs assignment

#includeint main()

; cout<

int i;

for( i =0 ;quizscores[i] ==20 ;i++)

cout<

第乙個迴圈在顯示了前5個測試成績後正確地終止,但第二個迴圈顯示整個陣列。更糟糕的是,該程式可能導致其他應用程式無法執行,您必須重新啟動計算機。

當然,錯誤出在下面的測試表示式中:

quizscores[i ]=20;

首先,由於它將乙個非零值賦給陣列元素,因此表示式始終為非零,所以始終為true。其次,由於表示式將賦值給陣列元素,它實際上修改了資料。第三,由於測試表示式一直為true,因此程式在到達陣列結尾後,仍不斷修改資料。它把乙個又乙個20放入記憶體中!這會帶來不好的影響。

發現這種錯誤的困難之處在於,**在語法上是正確的,因此編譯器不會將其視為錯誤(然而,由於c和c++程式設計師頻繁地犯這種錯誤,因此很多編譯器都會發出警告,詢問這是否是設計哲的真正意圖)。

警告:不要使用=來比較兩個量是否相等,而要使用==。

和c語言一樣,c++比起大多數程式語言來說,賦予程式設計師更大的自由。這種自由以程式設計師應付的更加責任為代價。只有良好的規劃才能避免程式超出標準c++陣列的邊界。然而,對於c++類,可以設計一種保護陣列型別來防止這種錯誤,以後提供了這樣的例子。另外,應在需要的時候在程式中加入保護措施。例如,在上個程式的迴圈中,應包括防止超出最後乙個成員的測試,這甚至對於「好」的迴圈來說是必要的。如果所有的成績都是20.「好」的迴圈也會超出陣列邊界。總之,迴圈需要測試陣列的值和索引的值。後面將介紹如何使用邏輯運算子將兩個這樣的測試合併為乙個條件。

你可能犯的面試致命錯誤

送走今天最後一位面試人員,我坐回自己的座位。同事們陸續開始打卡下班,禮貌的道別。面試,是我的工作之一。我面試我的同行,卻不能決定他或者她的去留。有時候,看著很多年輕的程式設計師眼裡的期待激動甚至有些獻媚,我的心都會被抽擊一下。很多年前,自己也是這樣找尋我的第乙份工作。很多年前,自己也有著這樣的期盼。...

c 中易犯的錯誤

變數定義 用於為變數分配儲存空間,還可為變數指定初始值。程式中,變數有且僅有乙個定義。變數宣告 用於向程式表明變數的型別和名字。定義也是宣告 當定義變數時我們宣告了它的型別和名字。extern關鍵字 通過使用extern關鍵字宣告變數名而不定義它。1.定義也是宣告,extern宣告不是定義,即不分配...

初學C語言容易犯的錯誤

本人通過對c語言的使用學習,積累了一些c程式設計時常犯的錯誤,寫給各位參考。1.將字元常量與字串常量混淆。char c c a 在這裡就混淆了字元常量與字串常量,字元常量是由一對單引號括起來的單個字元,字串常量是一對雙引號括起來的字串行。c規定以 作字串結束標誌,它是由系統自動加上的,所以字串 a ...