语法盐
語法鹽(英語:syntactic salt)是指在計算機語言中為了降低程式設計師撰寫出不良程式碼的設計,但其中仍會有潛藏錯誤存在的可能。例如,C語言或C++語言中Switch指令的case
中若不加break
編譯器並不會產生錯誤訊息,部分程式設計師認為宣告變數型態也是語法鹽的一種。
語法鹽的例子
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)而得名
Java
Java中並不允许將一个宣告为float类型的变量赋值给一个宣告为int类型的变量,但是C和C++会自动把float类型的变量捨去小數并赋值给int类型的变量。
int num1;
float pi=3.14159;
num1=pi; //賦值錯誤
C#
在C#中,如果要隱藏一個繼承的成員函數,需加上new
關鍵字來說明該成員函數是隱藏的,即便不使用new
關鍵字來說明隱藏也能通過編譯產生隱藏效果,但仍會產生編譯警告[1]。
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { } //隱藏繼承自BaseC的Invoke()成員函數
}
C#在switch
語法中的case
標記代码块內,如果沒有goto
、return
、throw
跳離語法,一定得加上break
語法[2]。
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1...");
//在此撰寫break或其他跳離語法,否則將產生編譯錯誤
case 2:
Console.WriteLine("... and/or Case 2");
break;
}
總結
語法鹽有可能會違背它的初衷,使程式碼的可讀性降低或浪費程式碼的空間占用。在極端條件下,真正有用的程式碼可能要比為了滿足語法鹽要求而增加的程式碼還要短。另外一種替代語法鹽的方法是在程式碼可能產生錯誤時,讓編譯器產生警告——這也是C和C++的編譯器常見的作法。
参考文献
- ^ new Modifier (C# Reference) - Visual Studio 2012. [2014-02-04]. (原始内容存档于2014-02-09).
- ^ switch (C# Reference) - Visual Studio 2012. [2014-02-04]. (原始内容存档于2014-02-04).
延伸阅读
- Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie. Structure and Interpretation of Computer Programs. Cambridge, MA: MIT Press. 1996 [1984]. ISBN 0-262-51087-1.
- Landin, P. J. Correspondence between ALGOL 60 and Church's Lambda-notation: part I. Communications of the ACM. 1965-02, 8 (2): 89–101 [2022-01-16]. ISSN 0001-0782. S2CID 6505810. doi:10.1145/363744.363749. (原始内容存档于2022-01-13) (英语).
- Landin, Peter J. Programming Without Imperatives – An Example. UNIVAC Systems Programming Research. 1965-03.
- Landin, P. J. Getting rid of labels. Higher-Order and Symbolic Computation. 2009-12, 22 (4): 315–329. ISSN 1388-3690. doi:10.1007/s10990-010-9057-5 (英语).
- Landin, Peter J. A Generalization of Jumps and Labels. UNIVAC Systems Programming Research. 1965-08., reprinted in Landin, Peter J. A Generalization of Jumps and Labels. Higher-Order and Symbolic Computation. 1998-12-01, 11 (2): 125–143. CiteSeerX 10.1.1.85.2610 . ISSN 1573-0557. doi:10.1023/A:1010068630801 (英语).
- 本條目部分或全部内容出自以GFDL授權發佈的《自由線上電腦詞典》(FOLDOC)。