1.4.1 程序错误的分类
编译器能捕捉特定类型的错误,并在检测到错误后输出一条错误消息。它检测的是语法错误,表示程序违反了编程(www.cppentry.com)语言的语法规则,比如遗漏分号。
编译器发现程序含有语法错误,会指出错误位置及类型。如果编译器说有语法错误,你应该相信真的有语法错误。但是,它报告的错误位置和错误性质也许是不正确的。它能很好地将错误定位在一两行代码中,但不能很好地定位错误的来源。这是由于编译器会猜测你写的代码的意思,所以很容易猜错。毕竟,编译器无法读懂你的思想。在显示的一系列错误消息中,第一条之后的消息极有可能是不正确的(无论错误的位置还是性质)。同样地,这是由于编译器必须猜测你的意思。如果刚开始就猜错了,自然会影响到后面的分析。
如果程序包含的内容直接违反语言的语法规则,编译器会给出一条错误消息。但是,编译器有时只给出一条警告消息,表明代码从技术上说没有违反语法规则,但它出乎寻常,所以可能是一个错误。给出一条警告消息时,编译器相当于说:"你真的是这个意思吗?"在程序开发的这一阶段,应该将每个警告都视为错误,除非教师允许忽略警告。
某些错误只有在程序运行时才会被计算机系统检测到,它们称为运行时错误。大多数计算机系统都能检测特定的运行时错误,并输出相应的错误消息。许多运行时错误与数值计算有关。例如,如果程序试图让一个数字除以0,通常就会产生运行时错误。
即使编译器成功编译程序,而且程序运行一通后没有产生运行时错误,也不能保证程序就是正确的。记住,编译器只能告诉你是否写了一个语法正确的C++(www.cppentry.com)程序,不能告诉你程序是否真的能做你希望它做的事情。基础算法的错误或者将算法翻译成C++(www.cppentry.com)语言时的错误称为逻辑错误。例如在图1.8中,如果将乘号*错误地写成了加号+,就属于逻辑错误。程序虽然能编译和正常运行,但答案是错误的。如果编译器成功编译了程序,也没有产生运行时错误,但结果不正确,表明程序肯定存在逻辑错误。逻辑错误是最难诊断的一种错误,因为计算机不会提供任何帮助你定位这种错误的消息。这不是计算机的错,因为对计算机来说,它只是根据你写的代码来判断你的意图。