《再讀》第二章 語法「陷阱」

2021-09-30 05:48:50 字數 3796 閱讀 5151

看了第一章後發現第一節還是那麼深奧啊~呵呵,今天看了第二章,雖然後點麻煩,不過

如果掌握了作者所說的關鍵的話,其實也不是特別難了,但還是有些宣告的方法覺得很怪異,也

許是因為沒有這樣用過,也沒聽說過吧。今天難得的在書中找到了一些錯誤啊~呵呵,這算是一

個不大不小的收穫吧。

1.對函式宣告的理解。

在c語言中,宣告分為兩個部分:型別部分和一組類似表示式的宣告符部分。宣告符從表

面上來看與表示式有些類似,對它求值的話應該會返回乙個宣告中給定的型別的結果。一旦知道

了如何宣告乙個給定型別的變數,那麼該型別的型別轉換符就很容易得到了:只要不宣告中的變

量和句末的分號去掉,然後用括號將之「封裝」起來就行了。對於複雜的宣告,我們只需要一層

一層的剖析,慢慢地就會知道其中的意思了。

2.運算子的優先順序。

在c語言中,運算子是相當複雜的東西,不僅僅需要考慮優先順序,還得考慮結合性,在這

一節中,作者為我們解決了優先順序問題,同時,我也是在這一章發現的書中的錯誤。首先說說正

確的運算子的優先順序順序。

最高是:()(函式呼叫運算子)、(下標運算子)、(->.)(結構成員選擇運算子)這四個運算子。

其次是:單目運算子再次算術運算子,其中% * /+ -的優先順序高。

再次是:移位運算子再次關係運算子,其中< > <= >=== !=的優先順序高。

再次是:按位運算子,按位與的優先順序高於按位或的優先順序,按位異或的優先順序在兩者之間。

再次是:邏輯運算子

再次是:條件運算子(唯一的三目運算子)。

再次是:賦值運算子(包括復合賦值運算子)。

最後是:逗號運算子

我們要記住兩點1.

任何乙個邏輯運算子的優先順序低於任何乙個關係運算子的優先順序。2.

移位

運算子的優先順序比運算子低,但是比關係運算子高。

發現的錯誤:

在原書(中文版)中,優先順序分成最高端的四個運算子,單目運算子和雙目運算子三部分,

其中雙目運算子又分為了算符運算子、位移運算子、關係運算子、邏輯運算子、賦值運算子、條

件運算子這幾個依次降低的等級。而錯誤也就出現在這裡,賦值運算子的真正的優先順序應該比條

件運算子的低,這一點在後文中也有提到,而此處所說的是賦值運算子的優先順序比條件運算子的

優先順序高,這是我發現的書中的第乙個錯誤(暫時),第二個錯誤是將條件運算子作為了二目元

算符,當然這一點譯者也有指出,這個失誤應該是原書作者的失誤,至於第乙個就不得而知了。

書中還提到「所有按位運算子的優先順序要比順序由運算子的優先順序高,每個『與』運算子的優先

級要比相應的『或』運算子的優先順序高,而按位異或運算子的優先順序介於按位與運算子與按位或

運算子之間」。這個順序運算子我不知道是單獨指逗號運算子還是指&&、||、?:和,這四個運算子,

我暫時也沒有查到,但看到網上有人將逗號運算子稱作順序求值運算子,但是根據我的理解和思

方式告訴我,謝謝合作。

3.注意作為語句結束標誌的分號。

尤其要注意if、while、return、結構體的宣告等語句。

4.switch語句。

建議:每乙個case語句後面都要記得加break;

如果是特殊情況,需要將幾句話共用的話要

寫注釋。default語句可有可無,可放置於任意位置,建議放置於最後,並且在末尾加乙個break

語句,以防萬一。

5.函式呼叫。

與某些語言不同,不論函式是否有引數,呼叫時都必須帶有括號。例如:f();與f;f();是

函式的呼叫,而f;卻什麼也不做,說的更精確點是計算函式f的位址,並不呼叫該函式。

6.「懸垂」。

根據c語言的處理方式,else會與向上的第乙個if配對,因此在進行if語句巢狀時往往

會引發「懸垂」的問題,即使是經驗豐富的程式設計師也會犯這樣的錯誤。例如下列**:

if ( x == 0 )

if ( y == 0 )

err();

else

這段**的真正目的是先判斷x是否等於0,如果是,則判斷y是否等於0,如果是,則呼叫err

函式,不是,則什麼也不幹;如果x不等於0,則執行else的語句。但是由於「懸垂」問題導

if ( x == 0 )

if ( y == 0 )

err();

else

也就是說,這段**真正實現的是先判斷x是否等於0,是,則判斷y是否等於0,是則執行err

函式,不是則執行else的語句,如果x不等於0則什麼也不做。

建議,將if的語句用括號括起來,如下列**:

if ( x == 0 ) else

又或者進行一些巨集定義,做一下處理:

#define if    else }

if x == 0 then

if y == 0 then

err();

fi else

z = x + y;

f(&z);

fi 這是第二章的內容。

c陷阱與缺陷學習筆記 第二章 語法陷阱

任何c變數的宣告都由兩部分組成 型別以及一組類似表示式的宣告符。宣告符從表面上看與表示式有些類似。對它求值應該返回乙個宣告中給定型別的結果。最簡單的宣告符就是單個符號 float f,g 這個宣告的含義就是 當對其求值時,表示式f和g的型別為浮點型型別。因為宣告符與表示式的相似,所以我們也可以在宣告...

第二章基礎語法

using system using system.collections.generic using system.linq using system.text using system.threading.tasks 引用命名空間 namespace 2.1csharp程式結構 命名空間或者專案...

第二章 if 語句和語法格式

第二天語言 變數的命名格式 識別符號可以有 字母 下劃線 數字組成 不能以數字開頭 不能與關鍵字重名 if語句格式 if 判斷的條件 結果成立時,要做的事情.if判斷條件 結果.else 結果不成立時,要做的事情.else 結果.結果滿足條件,才能繼續下一步。如果不滿足,就只能去做另外一件事情,或者...