Составные логические операторы C ++ не работают с оператором сравнения - PullRequest
0 голосов
/ 18 октября 2019

В программе, которую я пишу, есть два случая, в которых я использую составные логические операторы для эффективного сравнения переменной с несколькими значениями. Один из них работает просто отлично. У меня есть массив символов, и я хочу проверить, равен ли один из элементов одному из двух значений, без необходимости пересчитывать переменную. У меня также есть целое число под названием 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();
}

В отличие от первого условного выражения, в котором правильно сравниваются значения, второе всегда возвращает значение true, даже если меридианы действительно равны одному из четырехслучаев. Я знаю, что мог бы просто настроить это как четыре различных сравнения, каждое из которых имеет свой логический оператор, но мне просто интересно, почему это второе условие не работает, тогда как первое работает.

1 Ответ

2 голосов
/ 18 октября 2019

Да, вам может понадобиться прочитать о том, как работают операторы (и приоритет операторов).

Во-первых, это чепуха:

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

Вы говорите, если (charArray [8] == 'P') - true, или 'p' - true. «р» всегда будет истинным, потому что это не ноль. Не совсем понятно, что вы пытаетесь сделать с этим кодом, но я предполагаю, что-то вроде этого?

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

Что касается этого:

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

IF 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)
...