C++ 复合逻辑运算符不与比较运算符一起使用

C++ Compound Logical Operators not Working with Comparison Operator

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

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

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

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

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

是的,您可能需要阅读运算符的工作原理(和运算符优先级)。

首先,这是一句废话:

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")

如果 meridies 是一个字符数组,那么您应该这样做:

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