题外话、谭浩强与i++

By | 2015年12月20日

这个标题中并不包含对“谭浩强”先生的任何攻击之意

只是鉴于其在中国C语言的“统治地位”,而我们所要讨论的话题也和他有着莫大的联系

所以只好拿他开刀了 :mrgreen:

如果你正在使用(或使用过)或者类似的国内的教材

或许你将看到类似于下面这样的段落

ub1

然而实际上讨论这种运算是没有任何意义的,为什么这样说呢?我们可以尝试下面的这个程序

#include <stdio.h>

int main()
{
	int foo = 5;
	foo=(++foo)+(++foo)+(++foo);
	printf("%d",foo);
	return 0;
}

按照文中的说法,这个程序的运行结果应该是24

如果你使用的是codeblocks等使用gcc为编译器的环境,那么你将得到22的结果

ub2

是书错了还是编译器错了?

答案是书……

实际上,这个程序中的算式可以得到任何结果,而原因正是我们下一篇文章所要讨论的内容

这是一个未定义行为(Undifined Behavior,UB行为)

就是说标准中并没有对这种行为的结果做出规定

因此这种写法是不安全的,无法保证你得到的结果是你所期望的!

在任何一本负责的书上都应该明确的指出这种危险的行为,例如《C Primer Plus》

而国内的各种教材对此给出的“详解”,或许是国内教育体制所折射出的问题之一吧……

因此,如果你在任何一本c语言书上看到了如上的程序,并且详细的教你如何分析,那么100%可以肯定,这一定是一本垃圾书!

发表评论

电子邮件地址不会被公开。 必填项已用*标注