Как отформатировать несколько условий ИЛИ?

Я смотрю на выполнение условия множественного ИЛИ в конце do..while() цикл, и я не уверен, правильно ли я это делаю.

То, что у меня есть сейчас, выглядит следующим образом:

do
{
    (Insert code here)
}while(x != ('a' || 'e' || 'i' || 'o' || 'u');

Будет ли это работать или я должен написать это по-другому?

4 ответа

В качестве альтернативы явным отдельным тестам, правильно описанным в других ответах, вы можете найти более кратким / выразительным использование strchr:

do
{
    ...
} while (strchr("aeiou", x) == NULL);

Это не будет делать то, что вы хотите. Вы на самом деле хотите:

do // note the lowercase d
{
    (Insert code here)
}while(x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u');

Вы можете использовать скобки, чтобы сделать приоритеты очевидными, как while((x != 'a') && (x != 'e')),

Однако, если вы делаете эти проверки часто и со многими возможными буквами, вы должны изучить (битовые) наборы и просто проверить, находится ли x в этом наборе. (РЕДАКТИРОВАТЬ: или, как предполагает PaulR, strchr)


РЕДАКТИРОВАТЬ: То, что вы изначально написали, будет делать что-то совершенно другое. Выражение

(x != ('a' || 'e' || 'i' || 'o' || 'u'))

сначала оценивает обе стороны != затем сравнивает их. Левая сторона xв то время как правая сторона на самом деле 1, || является бинарным оператором и возвращает 1 если левая сторона или правая сторона !=0, что это такое. Так что было бы видеть, что 'a'!=0и прекратите оценивать других (поскольку он уже может рассчитать результат, он его оптимизирует). Так что условие на самом деле while (x != 1),

'a' является выражением, которое оценивается как ненулевое (Это на самом деле значение ASCII строчной буквы a.)

Так 'a' || 'b' тоже ненулевой и тд. На самом деле выражение 'a' || 'e' || 'i' || 'o' || 'u' вероятно оценивается во время компиляции: проверьте машинный код.

Если вам нужно проверить значение x против набора символьных литералов, то вам нужно написать что-то вроде

x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u'

Лично я был бы склонен построить функцию isVowelи использовать это как свой while состояние. Это может помочь с масштабируемостью.

Нет, это не сработает, потому что в вашем коде ('a' || 'e' || 'i' || 'o' || 'u') будет вычислен первым, который возвращает логическое значение, и его сравнение с x не имеет никакого смысла.

Я думаю, это то, что вы пытаетесь сделать

do
{
// (Insert code here)
}while(x!='a' && x!='e' && x!='i' && x!='o' && x!='u');
Другие вопросы по тегам