本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第2章,建議15-1,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在c語言中,最容易産生混淆的操作符要屬“=”與“==”。其中,“=”并不等于符号,而是指派操作符,如x=3。除此之外,還可以在一個語句中向多個變量賦同一個值,即多重指派。例如,在下面代碼中把0同時賦給x、y與z。
相對于隻有一個等号的指派操作符,關系操作符中的等于操作符采用兩個等号“==”來表示。正因如此,導緻了一個潛在的問題:出于習慣,我們可能經常将需要等于操作符的地方寫成指派操作符,如下面的代碼:
在上面的代碼中,if語句看起來好像是要檢查變量x是否等于變量y。實際上并非如此,此時if語句将變量y的值賦給變量x并檢查結果是否為非零。是以,雖然這裡的x不等于y,但是y的值為1,if語句還是會傳回真。
當然,當确實需要先對一個變量進行指派之後再檢查變量是否非零時,可以考慮顯式給出比較符。示例代碼如下:
這樣,程式的可讀性就得到了很大提高。
上面的示例代碼詳細地闡述了将等于操作符“==”誤寫成指派操作符“=”所帶來的嚴重後果。同理,将指派操作符“=”誤寫成等于操作符“==”也會帶來非常嚴重的後果。示例代碼如下:
在上面的代碼中,if語句的本意是将變量y的值賦給變量x,然後再判斷變量x的值是否小于0。如果變量x的值小于0,就執行語句printf("y<0n")。由于錯誤地将指派操作符“=”誤寫成等于操作符“==”,是以無論變量y為何值,都不會執行語句printf("y<0n")。原因是等于操作符“==”的結果隻能是0或1,永遠不會小于0。
除此之外,為了防止将等于操作符“==”誤寫成指派操作符“=”,還可以在代碼中采用如下形式:
這樣,就可以在一定程度上避免誤寫的發生。