​C++ 是一种广泛使用的编程语言,但也是编程错误最常见的语言之一。其中许多错误是由于逻辑错误造成的。特别是,比较操作中的错误可能会影响代码的准确性和可靠性。


(资料图片仅供参考)

​C++ 语言中有一种特定的比较错误,许多新开发人员会忽略这种错误。这种错误是由于对操作符在执行多个比较时的工作原理的错误理解而导致的。了解如何避免这个常见错误以及为什么会发生这个错误。

C++ 中的比较

C++编程语言提供了许多不同的功能和工具,包括基本的操作,如比较运算符。比较运算符是编程语言中的特殊操作,您可以使用它们将数据与彼此进行比较。开发人员经常使用这些运算符,特别是在创建算法时。

在日常生活中,您可以在许多不同的例子中看到比较运算符。例如,当您在杂货店购物时,您会心里比较价格。如果一种产品的价格比另一种低,您会选择那种产品。

在 if-else 语句中经常会看到比较运算符。比较运算符是检查一个值是否大于、小于或等于另一个值的地方。有一个非常小但重要的细节不应该忽视,即比较表达式的结果返回true或false,这是布尔值。这些值是编程中控制结构的基本组成部分之一。

例如,在C++编程语言中,“==”运算符检查两个值是否相等。如果这两个值相等,结果返回 true,否则结果将是 false。

if (a == b){    return true;} else{    return false;}
比较问题的示例

C++ 初学者常犯的一个错误是使用比较运算符。这些运算符允许程序员比较两个值,并根据比较结果执行不同的操作。然而,如果使用这些运算符不正确,可能会导致意想不到的错误。

例如,尽管表达式 3 < 15 < 10 在数学上是不正确的,但是 C++ 将其结果视为 true。您可以通过编写以下简单的测试程序来证明这一点。

首先,创建一个名为 linuxmi.cpp 的文件。使用您喜欢的代码编辑器打开此文件,并添加以下代码:

#include int a = 15;int main(){    if (3 < a < 10)    {        std::cout << "foo" << std::endl;    }    else    {        std::cout << "boo" << std::endl;    }    return 0;}

您可以使用此命令来编译和运行代码:

linuxmi@linuxmi:~/www.linuxmi.com$ g++ linuxmi.cpp -o linuxmi

现在你有一个名为 linuxmi 的程序。运行程序并检查其输出。

C++ 认为 3 < 15 < 10 是正确的,即使它在数学上是不正确的。那么造成这种结果的原因是什么?

C++中的比较问题原因

和大多数编程语言一样,C++ 从左到右读取代码。每个比较运算符都会产生一个布尔值。布尔值不仅代表 true 和 false,还有一个数学等价物。

计算机的工作原理依赖于 0 和 1。对于计算机来说,某件事情的结果只能是 true 或 false。计算机程序通常将数字 1 视为 true,数字 0 视为 false。

再次仔细查看比较问题,并从左到右阅读该语句,你会发现有两个不同的比较。第一个比较是在数字 3 和 15 之间。这是一个 true 值,因为 3 小于 15。

第二个比较是针对该结果和数字 10 之间的比较。由于需要进行数字比较,C++ 会将布尔值 true 静默转换为 1。1 小于 10,因此总的结果是 true。

总之,虽然这看起来像是一个数学谬误,但对于 C++ 和计算机来说,这种说法是正确的。

如何解决 C++ 中的比较问题

C++ 和其他大多数编程语言在逻辑比较方面使用了与传统数学不同的语法。数学表达式 3 < a < 15 的意思是“ 3 小于 a 且 a 小于 15”。然而,正如你所看到的,C++ 对这个表达式的解释是不同的。

要在 C++ 中表示“and”,可以使用“&&”运算符。然后,您可以将布尔表达式链接在一起,并使用像“&&”表示 AND,“||”表示OR和“!”表示 NOT 等运算符构建逻辑。像 Java 这样的语言使用相同的逻辑运算符。

使用正确的逻辑运算符,可以修复前面示例中的错误:

#include int a = 15;int main(){    if (3 < a && a < 10)    {    std::cout << "foo" << std::endl;    }    else    {    std::cout << "boo" << std::endl;    }        return 0;}

现在这段代码将测试 a 值是否大于 3 以及 a 值是否小于 10。编译并运行程序并观察结果。

前面的例子输出了“foo”,但现在程序输出了预期的“boo”。比较的左侧(3 < a)的布尔值为true。右侧的值(a < 10)为false。由于true和false始终是false,因此整个表达式的结果为false,因此条件失败,else块运行。

提示:你也可以尝试将 AND (&&) 运算符切换为 OR (||) 并观察不同的结果。

在 C++ 中逻辑检查的重要性

在C++中,逻辑比较涉及使用布尔值和比较运算符。确保使用正确的布尔值和比较运算符来控制程序的运行。因为C++通常不会完全失败,而是执行不同的行为,所以很难发现格式不正确的表达式。

现在您知道编译器如何忽略这个问题,并在从左到右读取每个比较时将其视为布尔值。在使用任何语言时都要注意这个问题,并学会识别其影响,以便提前一步。

推荐内容