Yoda 表示法错在哪里
(王垠 yinwang.org 版權所有,未經許可,請勿轉載)
在上一篇博文里,我提到了 Yoda 表示法。
Yoda Notation(Yoda 表示法)
它的含義是,在 C/C++ 里面使用這樣的表達式順序:
if ("blue" == theSky) ...這是為了避免意外的寫成:
if (theSky = "blue") ...“Yoda 表示法”的名字來源于《星球大戰》的 Yoda 大師。他說話的單詞順序相當奇特,比如:“Backwards it is, yes!”
一般認為
使用這個表示法是為了“變通”(workaround) C/C++ 的一個設計抉擇:使用?=?來表示賦值,而使用?==?來表示比較。這個設計充分的展現了“先輩的罪”(Sins of our Forefathers)這一詞匯的精髓。
我認為
使用?=?來表示賦值其實并不是真正的錯誤所在。真正的錯誤在于 C/C++ 的賦值語句不應該返回一個值。
也就是說,theSky = "blue"?的所有功能應該只是“賦值”這種“副作用”,副作用不應該具有“值”。即使你牽強附會說它有一個值,它的“值”也應該是?void(隨之這個?void?會被類型檢查所拒絕,因為它不是?if?所期望的?bool)。所以,一個良好的語言不應該允許你把?theSky = "blue"?放進?if (...)?的“條件”里面。如果你真的要賦值又要判斷,它會迫使你把這拆開成兩行:
theSky = "blue"; if (theSky) ...更近一步。if (theSky)?這個寫法其實也是一個先輩的罪。theSky?的類型是?string,它不應該可以直接被作為?bool?使用。if (...)?的條件應該必須是一個?bool。 所以這里其實應該寫成:
theSky = "blue"; if (theSky != NULL) ...因為賦值語句永遠不可能出現在條件的位置,所以之前的那種錯誤,即使我們使用?=?作為賦值操作符,也完全不可能出現。這樣我們也就完全沒必要用 Yoda 表示法了。
相反,如果我們只是把?=?換成像 Pascal 的?:=?這樣的賦值操作符,而保留其它的“特性”(賦值操作會返回值)的話,我們其實還是會遇到同樣的問題:
if (theSky := "blue") ...這里假設你想打?=,卻不小心打成了?:=。機會雖然小,但是仍然有可能。而我推薦的解決方案,會讓你故意想犯錯誤都不可能,編譯器會拒絕接受你的程序。
所以你看到了,問題的根源其實不在于賦值操作的名字,而是有更深的原因。
總結
以上是生活随笔為你收集整理的Yoda 表示法错在哪里的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 限制USB延迟启动
- 下一篇: winPcap_2_编译环境*注意*