Как отформатировать несколько условий ИЛИ?
Я смотрю на выполнение условия множественного ИЛИ в конце 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');