计算机科学

首页 > 计算机科学

语法盐

2018-09-03 09:38:06     所属分类:源代码

语法盐英语:syntactic salt)是指在计算机语言中为了降低程序员撰写出不良代码的设计,但其中仍会有潜藏错误存在的可能。例如,C语言或C++语言中Switch指令英语switch statementcase中若不加break编译器并不会产生错误消息,部分程序员认为宣告变量类型也是语法盐的一种。

目录

  • 1 语法盐的例子
    • 1.1 C++
    • 1.2 Java
    • 1.3 C#
  • 2 总结
  • 3 参考文献
  • 4 参见

语法盐的例子

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标记代码块内,如果没有gotoreturnthrow跳离语法,一定得加上break语法[2]

switch (caseSwitch)
{
    case 1:
        Console.WriteLine("Case 1...");
        //在此撰寫break或其他跳離語法,否則將產生編譯錯誤
    case 2:
        Console.WriteLine("... and/or Case 2");
        break;
}

总结

语法盐有可能会违背它的初衷,使代码的可读性降低或浪费代码的空间占用。在极端条件下,真正有用的代码可能要比为了满足语法盐要求而增加的代码还要短。另外一种替代语法盐的方法是在代码可能产生错误时,让编译器产生警告——这也是C和C++的编译器常见的作法。

参考文献

  1. ^ new Modifier (C# Reference) - Visual Studio 2012
  2. ^ switch (C# Reference) - Visual Studio 2012

参见

  • 语法糖
版权声明:本文由北城百科网创作,转载请联系管理获取授权,未经容许转载必究。https://www.beichengjiu.com/computerscience/340474.html

显示全文

取消

感谢您的支持,我会继续努力的!

扫码支持
支付宝扫一扫赏金或者微信支付5毛钱,阅读全文

打开微信扫一扫,即可进行阅读全文哦


上一篇:向后移植
下一篇:语法糖
相关推荐