首页 > 解决方案 > C++ 复合逻辑运算符不与比较运算符一起使用

问题描述

我正在编写的程序中有两种情况,我正在使用复合逻辑运算符有效地将变量与多个值进行比较。其中之一工作得很好。我有一个字符数组,我想检查其中一个元素是否等于两个值之一,而不必重新声明变量。我也有一个叫做hourInt的整数,但这并不重要。我用于条件的代码如下:

 if (charArray[8] == 'P' || 'p' && hourInt != 12){
    hourInt += 12;
 }
 if (charArray[8] == 'A' || 'a' && hourInt == 12){
    hourInt -= 12;
 }

并且这两个条件都正确执行了它们的工作——它们检查 charArray[8] 是否等于两个值之一。但是,后来在程序中,我再次尝试使用复合逻辑运算符。我有一个名为 meridis 的两个字符的字符串,我想看看它是否不等于四个值之一。我用复合逻辑运算符设置了一个条件,如下所示:

if (meridies != "AM" || "am" || "PM" || "pm"){
    cout << "Error: Unknown value for the meridies." << endl;
    return inputTime();
}

与正确比较值的第一个条件不同,第二个条件始终返回 true,即使 meridies 确实等于四种情况之一。我知道我可以将其设置为四个不同的比较,每个比较都有自己的逻辑运算符,但我只是想知道为什么第二个条件不起作用而第一个条件起作用。

标签: c++logical-operatorscomparison-operators

解决方案


是的,您可能需要阅读运算符的工作方式(以及运算符优先级)。

首先,这是一个废话:

charArray[8] == 'P' || 'p'

您是说,如果 (charArray[8] == 'P') 为真,或 'p' 为真。'p' 将永远为真,因为它不为零。目前尚不完全清楚您要使用该代码做什么,但我假设这些内容?

if ( (charArray[8] == 'P' || charArray[8] == 'p') && hourInt != 12)

至于这个:

if (meridies != "AM" || "am" || "PM" || "pm")

如果meridas 是一个 std::string,那么它应该是:

if (meridies != "AM" && meridies != "am" && meridies != "PM" && meridies != "pm")

但是,如果 meridis 是一个 char 数组,那么您应该这样做:

if (strcmp(meridies, "AM") != 0 && 
    strcmp(meridies, "am") != 0 && 
    strcmp(meridies, "PM") != 0 && 
    strcmp(meridies, "pm") != 0)

推荐阅读