关于谭浩强教授

Author Avatar
purefkh 5月 25, 2018
  • 在其它设备中阅读本文章

经常在各种地方看到 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.总之,不要写出别人看不懂的、也不知道系统会怎样执行的程序。

窃为谭老爷子鸣不平啊。

最后,引别人的一句话来结束这篇水文:

他在我看来,是先驱,是开拓者,是伟人。
人类哪有不犯错的?所以,书中的错误不能掩盖谭老先生的光辉。

此图无任何恶意,仅是调侃之意