在本章中,我们将探讨与查找和删除 C++ 程序中的错误相关的主题,包括学习如何使用 IDE 中的集成调试器。
尽管调试工具和技术不是 C++ 标准的一部分,但学习查找并消除所编写的程序中的错误是成为一名成功程序员的极其重要的一部分。因此,我们将花一些时间讨论这些主题,以便随着您编写的程序变得更加复杂,您诊断和修复问题的能力也会以类似的速度提高。
如果您有使用其他编程语言调试程序的经验,那么您会对其中的大部分内容感到熟悉。
语法和语义错误
错误通常分为两类之一:语法错误和语义错误(逻辑错误)。
当您编写的语句不符合C++ 语言的语法时,就会出现语法错误。 这包括诸如缺少分号、使用未声明的变量、不匹配的括号或大括号等错误。例如,以下程序包含相当多的语法错误:
#include <iostream>
int main()
{
std::cout < "Hi there"; << x << '\n'; // 无效运算符 (<)、无关分号、未声明变量 (x)
return 0 // 语句末尾缺少分号
}
幸运的是,编译器通常会捕获语法错误并生成警告或错误,因此您可以轻松识别和修复问题。然后只需不断编译,直到消除所有错误。
一旦您的程序编译正确,让它实际产生您想要的结果可能会有些棘手。当语句在语法上有效,但没有达到程序员的预期时,就会出现语义错误。
有时这些错误会导致程序崩溃,例如除零错误:
#include <iostream>
int main()
{
int a { 10 };
int b { 0 };
std::cout << a << " / " << b << " = " << a / b << '\n'; // 除以 0 在数学中没有定义
return 0;
}
更常见的是,这些只会产生错误的值或行为:
#include <iostream>
int main()
{
int x; // 没有提供初始化
std::cout << x << '\n'; // 使用未初始化的变量会导致未定义的结果
return 0;
}
或者
#include <iostream>
int add(int x, int y) // 这个函数应该执行加法
{
return x - y; // 但由于使用了错误的运算符而没有执行加法
}
int main()
{
std::cout << "5 + 3 = " << add(5, 3) << '\n'; // 输出结果应该是8,而不是2
return 0;
}
或者
#include <iostream>
int main()
{
return 0; // 函数在这里返回
std::cout << "Hello, world!\n"; // 所以这永远不会执行
}
现代编译器在检测某些类型的常见语义错误(例如使用未初始化的变量)方面做得越来越好。 然而,在大多数情况下,编译器将无法捕获大多数此类问题,因为编译器旨在强制执行语法,而不是意图。
在上面的例子中,错误很容易被发现。 但在大多数重要的程序中,通过观察代码并不容易发现语义错误。 这就是调试技术可以派上用场的地方。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-syntax-and-semantic-errors/