没有任何一种编程语言能够保证最终生成的执行代码能完全表达程序员的意图. C语言不能例外.
程序员的过错
程序员犯错的机会很多,从简单的错误拼写变量名到对复杂算法的误解.编程语言自身的特点对这种情况有一定的责任. 首先语言本身的风格与表达方式能对程序员起到帮助的同时也会引起一些理解阻碍.其次语言本身会导致错误拼写更容易发生.最后编程语言本身并非能完全侦测到这种错误.
由于C语言的风格与表达方式较为自由, 程序员可以设计出结构清晰,表达生动的代码, 也可以写出晦涩难懂的代码. 如果将功能安全作为重要的设计目标, 后者显然是不能接受的风格.
C语言的语法使得程序员能够写出合乎规则但是完全与设计目标背道而驰的代码. 比如:
if(a==1)
...
if(a=1)
...
又比如:
if(bFlag)
doSomeThing();
if(bFlag);
doSomeThing();
即是语法灵活所导致的经常性的编程错误.
C语言的哲学在于:程序员都是聪明的,能够明白自己在做什么. 所以语言本身侦测错误的能力较弱. 比较突出的一点是C语言在类型检测上基本上不做任何努力. 比如将浮点数赋值给整型变量. 大多数此类错误会被语言使用强制转换的手段隐藏. 如果给C编译器一个方形的插件和一个圆形过孔, 它也不会抱怨,只会默默地使之彼此兼容!