August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
当你使用编译器的时候,你会希望它足够聪明,能够理解你要表达的意思,也就是说,你可能会希望编译器报告的一些错误并不是真正的错误。这种想法是很自然的。令人惊奇的是,当你有了一定编程经验后,你会希望编译器能够拒绝更多代码,而不是更少。看下面的例子:
对于x4,我们没有从编译器得到错误信息。对于编译器来说,area(10,-7)是正确的:area()需要两个整型参数,你给定了两个,而没有人规定参数必须是正数。
对于x5来说,好的编译器将给出警告信息:double型数10.7和9.3被截取为int型数10和9(见3.9.2节)。然而,(老的)语法规则认为可以隐式地将double转换为int,因此编译器不会拒绝函数调用area(10.7,9.3)。
对x6的初始化存在与area(10.7,9.3)同样的问题。area(100,9999)的int型返回值,即999900,被赋给一个char型变量。x6最有可能的结果是“截取值”-36。同样,一个好的编译器将会报告相关的警告信息,即便(老的)语法规则不拒绝相关代码。
当获得一定编程经验后,你将学会如何脱离编译器去检查错误和避免编译器的弱点。但是,不要过分自信:“程序已编译”并不意味着它能够运行。即使它能够运行,在你消除逻辑错误前,通常程序给出的也是错误的结果。