2012-01-08 7 views
1

Я попытался проверить это сам, прежде чем спрашивать на форуме, но мой простой код для проверки этого не работал.Можете ли вы использовать условия 3+ ИЛИ в выражении if?

#include <iostream> 
using namespace std; 

int main() { 
cout << "Enter int: "; 
int number; 
cin >> number; 
if (number==1||2||3) { 
    cout << "Your number was 1, 2, or 3." << endl; 
} 
else if (number==4||5||6) { 
    cout << "Your number was 4, 5, or 6." << endl; 
} 
else { 
    cout << "Your number was above 6." << endl; 
} 
return 0; 
} 

Он всегда возвращает первое условие. Мой вопрос в том, возможно ли иметь более 2 условий? Или мой синтаксис неверен?

+8

Ваш синтаксис неверен. 'if (number == 1 || number == 2 || number == 3)' –

+1

Или используйте 'switch' /' case'. – Mat

+0

Я хотел бы увидеть пример с двумя работами, это НИКОГДА не будет работать. Каковы ваши ожидания по порядку оценки, и что бы вы сделали «если (2)»? –

ответ

6

Вы должны закодировать тесты differenty:

if (number==1 || number==2 || number==3) { 
    cout << "Your number was 1, 2, or 3." << endl; 
} 
else if (number==4 || number==5 || number==6) { 
    cout << "Your number was 4, 5, or 6." << endl; 
} 
else { 
    cout << "Your number was above 6." << endl; 
} 

, как вы это делали, то первое условие интерпретируется как если бы она была написана как этот

if ((number == 1) || 2 || 3) { 

Логическое или оператора (||) определяется для оценки истинному значению, если левая сторона истинна или если левая сторона ложна, а правая сторона - истина. Поскольку 2 является истинным значением (как и 3), выражение принимает значение true независимо от значения number.

+2

Разве вы не кладете пробелы вокруг '||'? Это немного трудно читать, не так ли? :-) –

+0

Нет. Я не использую пробелы вокруг любого из моих операторов (+, -, ||, <и т. Д.). Мне все труднее читать со всеми этими пространствами. –

+1

Или лучше: 'number> = 1 && number <= 3'. Поместите в пробелы кстати. –

0

Попробуйте отделить их все. Я уверен, что ваш синтаксис неверен

#include <iostream> 
using namespace std; 

int main() { 
cout << "Enter int: "; 
int number; 
cin >> number; 
if ((number==1)||(number==2)||(number==3)) { 
    cout << "Your number was 1, 2, or 3." << endl; 
} 
else if ((number==4)||(number==5)||(number==6)) { 
    cout << "Your number was 4, 5, or 6." << endl; 
} 
else { 
    cout << "Your number was above 6." << endl; 
} 
return 0; 
} 
+3

Это законный синтаксис - возможно, не то, что он на самом деле * хотел *. – Puppy

+0

Я должен был уточнить. Неправильно для поведения, которое он ожидал. – schwert

1
if (number==1||2||3) 

Этот код может быть как круглые скобки

if ((number==1) || (2) || (3)) 

или другими словами if(number == 1 || true || true), всегда приводит к истинным. Сравните по одному (number == 1 || number == 2 || number == 3) или с диапазонами (number >= 1 && number <= 3).

0
if (number > 0 && number < 4) { 
    cout << "Your number was 1, 2, or 3." << endl; 
} 
else if (number > 3 && number < 7) { 
    cout << "Your number was 4, 5, or 6." << endl; 
} 
else if(number > 0) { 
    cout << "Your number was above 6." << endl; 
} 

Является ли мой синтаксис неправильно?

Да, пожалуйста, знайте, что то, что вы испытали, произошло потому, что (2) и (3) оценивается как истина. Вместо этого вы бы сделали число == 1 || число == 2 || Количество == 3

0
number == 1 || 2 || 3 

эквивалентно

((number == 1) || 2) || 3) 

и как результат оператора || является 1, если либо его левый или его правый операнд отличается от 0, приведенное выше выражение всегда вычисляется в

1 

так, что вы действительно хотите следующее выражение

number == 1 || number == 2 || number == 3 
2

Пока вы, как показали другие, переписываете свои тесты, чтобы разрешить то, что вы хотите, я думаю, что стоит также рассмотреть несколько альтернатив.Один будет переключатель заявление:

switch (number) { 
    case 1: 
    case 2: 
    case 3: 
     cout << "Your number was 1, 2, or 3." << endl; 
     break; 
    case 4: 
    case 5: 
    case 6: 
     cout << "Your number was 4, 5, or 6." << endl; 
     break; 
    default: 
     cout << "Your number was above 6." << endl; 
} 

Лично я бы, вероятно, сделать что-то подобное, хотя:

char const *msgs[] = { 
    "Your number was 1, 2, or 3.\n", 
    "Your number was 4, 5, or 6.\n" 
}; 

if (number < 1 || number > 6) 
    std::cout << "Your number was outside the range 1..6.\n"; 
else 
    std::cout << msgs[(number-1)/3]; 

Обратите внимание, что, как он стоит прямо сейчас, ваш код говорит, что 0 и все отрицательные числа больше 6. Я оставил это в первом примере, но зафиксировал его во втором.

+0

Вправо. Для моего приложения, хотя это не имеет значения, что цифры оцениваются, потому что они всегда находятся в диапазоне 1-9, поэтому просто использование первого примера работает для меня. Также мне хотелось бы, чтобы я воровал, если бы использовал второй пример, так как сам не писал. :П –

Смежные вопросы