关于谭浩强教授
经常在各种地方看到 void main()
以及 main()
,所以特地查了一些资料来说明这是不好的。
首先引一段 C Primer Plus
中的话
如果浏览旧式的C代码,会发现程序以如下形式开始:
main()
C90 标准勉强接受这种形式,但是 C99 和 C11 标准不允许这样写。因此,即使你使用的编译器允许,也不要这样写。
你还会看到下面这种形式:
void main()
一些编译器允许这样写,但是所有的标准都未必认可这种写法。因此,编译器不必接受这种形式,而且许多编译器都不能这么写。
下面说一下我查到的
void main()
首先,从标准角度(所有版本)来说,void main()肯定是错的,没有任何标准(C89/99/11以及C++98/03/11/14)中允许过这种写法。
void main()的写法可能是从嵌入式来的……没有操作系统,入口点是硬件实现,返回任何东西都没意义。
main()
在C89里,函数没有显式声明返回类型,则默认是int,但是这种方式在C99之后就被废除掉了。
又查了一下谭浩强教授的履历,wikipedia
上指出:
谭浩强,1958年清华大学自动控制系毕业。
自动化,看看 百度百科
是怎么说的:
专业有两个发展方向,第一个是工业过程控制方向,第二个是嵌入式系统方向。
结合来看,接触单片机比较多的谭教授在教材里反复使用 void main
也就不足为怪了吧。
在C99/11标准中,明确定义了对于标准的main函数的两个原型:
int main(void)
以及
int main(int argc, char *argv[])
建议大家都能使用标准形式,这样把程序从一个编译器移至另一个编译器是会方便很多。
但是,仅从次就片面的否定谭老爷子的贡献是完全不可取的。
在知乎上看到了这样的描述:
象牙塔和各类计算机等级考试中乐此不疲的“(++i) + (++i) + (++i)”问题。
很多程序员将这种病态、晦涩的编码方式归咎于谭浩强版的《C 程序设计》,认为谭老爷子是这种学究代码的始作俑者。
我后来饶有兴致地考证了一番,发现谭老爷子在《C 程序设计》(第二版)的第 58~59 页中对这种情况进行了讨论,并指出以下几点:
1.应该避免++/–的副作用可能产生的歧义性,建议将这样的表达式拆开写。
2.对于 i+++j 的情况,应使用括号来使代码明晰以避免误解,如 (i++)+j 或 i+(++j)。
3.总之,不要写出别人看不懂的、也不知道系统会怎样执行的程序。
窃为谭老爷子鸣不平啊。
最后,引别人的一句话来结束这篇水文:
他在我看来,是先驱,是开拓者,是伟人。
人类哪有不犯错的?所以,书中的错误不能掩盖谭老先生的光辉。