基本介紹
簡介,具體內容,語法鹽的例子,C++,總結,
簡介
具體內容
在Java中,在沒有額外的語言明確地說明意圖的情形下,Java不允許將一個聲明為float類型的變數賦值給一個聲明為int類型的變數,但是C和C++會自動把float類型的變數縮短並賦值給int類型的變數。
在C#中,若隱藏一個繼承類別的成員,需加上new關鍵字來說明是有意隱藏此成員,否則會產生一個警告。C語言或C++語言中Switch指令的case中若不加break也不會有錯誤訊息,因此有潛在錯誤的可能,C#在switch中未空白的case標記內,若沒有goto、return、throw指令,就一定要加break指令(若要像C語言或C++語言一様,一個case後要執行另一個case指令,要加上goto並標示要跳轉的標記)。
語法鹽有可能會違背它的初衷,使得代碼可讀性下降或損害代碼質量。在極端條件下,真正有用的代碼可能要比為了滿足語法鹽要求而加的代碼還要短。另外一種代替語法鹽的方式是在代碼非常有可能出錯的時候,讓編譯器產生警告——這也是現代C和C++編譯器常見的功能。
批評者開玩笑說:喜歡語法鹽的同志們,一定都是受虐狂——自己沒事找事給自己下套玩 。
語法鹽的例子
C++
相較於C中形如 (T)v 的 C 樣式轉換和 T(v) 的函式樣式轉換,C++通過引入 static_cast、reinterpret_cast、const_cast 和 dynamic_cast 這四種轉換來強迫程式設計師多敲鍵盤,從而令他們少用轉換。
double d =0.1;const int i=static_cast<int>(d);//靜態轉換:編譯時能進行類型檢查的轉換void *pv=reinterpret_cast<void*>(i);//重解釋轉換:在不兼容的類型間進行轉換(例如指針與非指針)const int *pi=&i;int *pi2=const_cast<int*>(pi);//常量轉換:去掉 const、volatile 等修飾符class C{ public: virtual ~C(){};}; class D: pub lic C{};D d; const C &rc=d;const D &rd=dynamic_cast<const D &>(rc); //動態轉換:在類繼承體系里上下轉換,因必須在編譯時檢查(RTTI)而得名
int num1;float pi=3.14159;num1=pi; //賦值錯誤