C語言運算符另類分類法

C語言運算符另類分類法

原文出自:劉建文 | 學術半·IT歌·文(http://arttech.us)

 

一般的C語言程序設計文本對C運算符的分類大概都是分爲五大類:算術運算符、 關係運算符、邏輯運算符、按位運算符和一些特殊任務的運算符。這種分類法表面上“合情合理”,事實相當的籠統含混。算術運算符好理解,什麼叫關係運算符,關係可運算麼?關係是什麼數據值參與運算? 不甘於這種含混的分類法,這幾天花了一點時間對C語言的全部運算符進行分揀,分別從設計、語義和哲學等多個角度對C運算符進行分析,並且歸納出以下五類:

  1. 計算指令
  2. 判斷指令
  3. 保存指令
  4. 對象元操作指令
  5. 自定義指令

此分類的根據是機器的功能,理解它需一些計算理論知識,分類標準在尾部解析。

運算符與機器指令

從語言與機器的關係看,運算符就是操值指令,C語言操作符就是C語言機的指令。本文將[運算符]替換爲更本質的[指令]一詞,理解時可互換。

  • 注意:每種運算符的操作數都有約定的值類型,詳細請看標準
  • 注意:運算符有優先級和結合性兩項本質屬性

計算指令

‘計算’一詞其實不夠深刻,計算的概念源自具體的特殊的算術運算,可以的話用[操值指令]更一般更深刻。

二元算術指令

 

  • 設計:數值計算,二元操值指令,對二值進行物理增減,操值結果類型不變(邏輯:概念的處理)
  • 語義:在信息值A的基礎上添加或整倍添加、去除或整倍去除信息值
  • 哲學:機器是“懂”信息單位——整數和浮點數,並且會這種數值物理增去操作
  • 指令:
`+, -' Addition and subtraction. Defined on integral types, floating-point types and pointer types.
`*, /, %' Multiplication, division, and modulus. Multiplication and division are defined on integral and floating-point types. Modulus is defined on integral types.

 

一元算術指令

  • 哲學:在算術指令的語義基礎上覆合了少許操作語義,讓語言表達更緊湊
  • 指令:
`++, --' Increment and decrement. When appearing before a variable, the operation is performed before the variable is used in an expression; when appearing after it, the variable's value is used before the operation takes place. `-,+' Negative. Defined on integral and floating-point types. Same precedence as `++'.

按位指令

  • 設計:位級計算(操值)
  • 語義:計算機處理二進制數據,對二整數[按位]進行復合判斷,產生新值
  • 哲學:按位指令複合了複合判斷、取一位和移位等操作語義(後兩個與具體機器相關),這是對指令複雜化的典型例子。
  • 指令:

 

`|' 按位或 Bitwise OR. Defined on integral types. `^' 按位異或 Bitwise exclusive-OR. Defined on integral types. `&' 按位與 Bitwise AND. Defined on integral types. `~' 按位非 Bitwise complement operator. Defined on integral types. Same precedence as `++'. `<<, >>' 移位 left shift, and right shift. Defined on integral types.

 

判斷指令

爲機器提供go where的根據

關係判斷指令

  • 設計:邏輯推理,用於流程控制,決於機器“go where”去向的根據,二元操值指令,對二值的[數值關係](大小相等)進行判別,產生一個真值(邏輯:判斷)
  • 語義:比對數值信息A與B,對“數值關係判斷P:A OP B”進行真假估值
  • 哲學:機器懂數值大小,並且懂真值
  • 指令:
`==, !=' Equality and inequality. Defined on scalar types. The value of these expressions is 0 for false and non-zero for true. `<, >, <=, >=' Less than, greater than, less than or equal, greater than or equal. Defined on scalar types. The value of these expressions is 0 for false and non-zero for true.

複合判斷指令(常稱邏輯指令)

  • 設計:邏輯推理(同上),二元或一元操值指令,對(二)真值(0爲假非0爲真)的進行復合判斷,產生一個真值(邏輯:複合判斷——合取、析取和反取)
  • 語義:比對真值信息(只有真假二值)A與B,進行邏輯的信息計算,產生一個真值,這種計算不像數值計算那是物理的,它是邏輯的,按一種[抽象的規則]進行輸入輸出計算,例如“邏輯與”,它的規則就是當A和B都爲真時,計算結果爲真,否則結果爲假。雖然這些規則是邏輯的,但它不是人造的,而是客觀規律決定的。真值與數值是客觀世界最抽象信息量最小的信息單位;並且它們是完全不同類型的信息,相應有不同類型的操值方法,真值無加減之說,數值亦無或非之言;真值對“思維如實反映客觀世界與否”進行抽象;數值對“數量信息”進行抽象。用哲學的術語理解,真值是思維與存在關係的描述,數值只是對存在進行客觀描述。當大腦進行單一的推理(歸納演繹等)時,不涉及真值的評判,但當論證,尤其是複合論證決策帶有未知的判斷時,真值必須介入。
  • 哲學:機器懂與、或、非的邏輯語義
  • 指令:
`||' Logical OR. Defined on integral types. `&&' Logical AND. Defined on integral types. `!' Logical negation. Defined on integral types. Same precedence as `++'.

條件指令

  • 設計:對二路分支精簡化,特殊化
  • 語義:
  • 哲學:複合判斷指令和估值操作,不是簡單的估值
  • 指令:
`?:' The ternary operator. `A ? B : C' can be thought of as: if A then B else C. A should be of an integral type.

保存指令

實現機器的保值功能

賦值指令

  • 設計:操值(計算)結果(狀態)保存,簡單搬動數據
  • 語義:把右值(表達式)估到的值保存到左值指向存儲區
  • 哲學:賦值指令不同於算術等計算指令,亦不似於邏輯判斷指令取得go where根據,它屬於機器第三種最基本的指令,與機器的記憶體部分相關聯。
  • 指令:
`=' Assignment. The value of an assignment expression is the value assigned. Defined on scalar types. `OP=' Used in an expression of the form `A OP= B', and translated to `A = A OP B'. `OP=' and `=' have the same precedence. OP is any one of the operators `|', `^', `&', `<<', `>>', `+', `-', `*', `/', `%'.

對象元操作指令

對象地址指令

  • 設計:取得對象地址值,或直接對地址指向區進行取值(沒有估求過程)
  • 哲學:對象地址不屬於C語言計算的概念,屬於物理機器的一個概念,只是利用了機器實現的一個技巧。雖然C中有地址運算,那只是過順水推舟,利用這種技巧實現了某高級語義,比如數組訪問。
  • 指令:
`*' Pointer dereferencing. Defined on pointer types. Same precedence as `++'. `&' Address operator. Defined on variables. Same precedence as `++'.

對象類型指令

  • 設計:
  • 哲學:
  • 指令:
'sizeof object' 求某特殊對象大小,單位字節 'sizeof ( typename )' 求對象類大小 '(typename) expr' 強制類型轉換

對象內部訪問指令

`., ->' Structure member, and pointer-to-structure member. For convenience, GDB regards the two as equivalent, choosing whether to dereference a pointer based on the stored type information. Defined on `struct' and `union' data. `.*, ->*' Dereferences of pointers to members. `[]' Array indexing. `A[I]' is defined as `*(A+I)'. Same precedence as `->'.

自定義指令

  • 設計:函數 type f(a,b,...),a,b, ... can be any type.
  • 哲學:函數的真正身份是機器指令,一種複合的高級指令。在上面提到的C基本指令和相對應的數據類型的基礎上覆合出更多更復雜的完成某種計算任務的指令。
  • 指令:
`()' Function parameter list. Same precedence as `->'.

到此,C運算符的真面目被函數原型表露無遺: type f(a,b,c,...) 操作數、操作名和操作結果類型。

估值、操值、保值和go where

計算理論中對圖靈機功能的描述是這樣的,讀、根據內部狀態和硬編碼規則產生移動和寫。由於圖靈機是抽象的,它的功能部件與實際的機器上並沒有一對一的實現。有學過通信理論的同學可以用通信模型來理解實際機器如何現實圖靈機計算。 通信是一種交流活動,交流的主方A將信息翻譯成信號(聲音或文字),受方B再將信號解釋成信息理解。將這個模型套入編程計算的場景時,主方A好比程序員,信號是程序,受方B是機器。機器必須有聽取信號和理解信息的功能,對應圖靈的讀功能,這裏把這種功能定義爲估值 ; 另外,要實現計算,機器必須有對信息進行處理的功能,對應圖靈機的移動(或復加寫)功能,這裏把這種功能一般化爲操值 ; 如果計算只有單獨一步,那麼機器只需要具備估值和操值的功能足矣,但是程序是多步計算,所以機器還必須具有go where的功能(默認是go next)和保存中間計算結果的功能。前者叫go where ,後者叫保值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章