Операторы выбора — if , if-else и switch
if-else switch Операторы if выбора и инструкции для выполнения из множества возможных путей на основе значения выражения. Оператор if выполняет инструкцию только в том случае, если заданное логическое выражение вычисляется true . Оператор if-else позволяет выбрать, какие из двух путей кода следует выполнять на основе логического выражения. Оператор switch выбирает список инструкций для выполнения на основе сопоставления шаблона с выражением.
Инструкция if
Оператор if может быть в любой из следующих двух форм:
-
Оператор if с частью else выбирает для выполнения один из двух операторов на основе значения логического выражения, как показано в следующем примере:
DisplayWeatherReport(15.0); // Output: Cold. DisplayWeatherReport(24.0); // Output: Perfect! void DisplayWeatherReport(double tempInCelsius) < if (tempInCelsius < 20.0) < Console.WriteLine("Cold."); >else < Console.WriteLine("Perfect!"); >>
DisplayMeasurement(45); // Output: The measurement value is 45 DisplayMeasurement(-3); // Output: Warning: not acceptable value! The measurement value is -3 void DisplayMeasurement(double value) < if (value < 0 || value >100) < Console.Write("Warning: not acceptable value! "); >Console.WriteLine($"The measurement value is "); >
Операторы if можно вкладывать для проверки нескольких условий, как показано в следующем примере:
DisplayCharacter('f'); // Output: A lowercase letter: f DisplayCharacter('R'); // Output: An uppercase letter: R DisplayCharacter('8'); // Output: A digit: 8 DisplayCharacter(','); // Output: Not alphanumeric character: , void DisplayCharacter(char ch) < if (char.IsUpper(ch)) < Console.WriteLine($"An uppercase letter: "); > else if (char.IsLower(ch)) < Console.WriteLine($"A lowercase letter: "); > else if (char.IsDigit(ch)) < Console.WriteLine($"A digit: "); > else < Console.WriteLine($"Not alphanumeric character: "); > >
В контексте выражения можно использовать условный оператор ?: для вычисления одного из двух выражений на основе значения логического выражения.
Инструкция switch
Оператор switch выбирает список операторов, который нужно выполнить, на основе соответствия шаблона выражению соответствия, как показано в следующем примере:
DisplayMeasurement(-4); // Output: Measured value is -4; too low. DisplayMeasurement(5); // Output: Measured value is 5. DisplayMeasurement(30); // Output: Measured value is 30; too high. DisplayMeasurement(double.NaN); // Output: Failed measurement. void DisplayMeasurement(double measurement) < switch (measurement) < case < 0.0: Console.WriteLine($"Measured value is ; too low."); break; case > 15.0: Console.WriteLine($"Measured value is ; too high."); break; case double.NaN: Console.WriteLine("Failed measurement."); break; default: Console.WriteLine($"Measured value is ."); break; > >
В предыдущем примере оператор switch использует следующие шаблоны:
- Реляционные шаблоны — для сравнения результата выражения с константой.
- Шаблон константы: проверьте, равен ли результат выражения константе.
Сведения о шаблонах, поддерживаемых оператором switch , см. в статье Шаблоны.
В предыдущем примере также показана ветвь default . Ветвь default указывает операторы, которые нужно выполнить, если выражение не соответствует ни одному другому шаблону. Если выражение совпадения не соответствует ни одному шаблону регистра, и нет default регистра, элемент управления попадает через инструкцию switch .
Оператор switch выполняет список операторов в первом разделе switch, шаблон ветви которого соответствует выражению соответствия, а условие ветви, если оно есть, равно true . Оператор switch оценивает шаблоны ветвей в порядке, в котором они указаны в коде, сверху вниз. Компилятор создает ошибку, если оператор switch содержит недостижимую ветвь. Это ветвь, которая уже была обработана в верхнем регистре или шаблон которой невозможно сопоставить.
Ветвь default может находиться в любом месте в операторе switch . Независимо от его положения, регистр вычисляется только в том случае, default если все остальные шаблоны регистра не совпадают или goto default; оператор выполняется в одном из разделов коммутатора.
Можно указать несколько шаблонов ветвей для одного раздела оператора switch , как показано в следующем примере:
DisplayMeasurement(-4); // Output: Measured value is -4; out of an acceptable range. DisplayMeasurement(50); // Output: Measured value is 50. DisplayMeasurement(132); // Output: Measured value is 132; out of an acceptable range. void DisplayMeasurement(int measurement) < switch (measurement) < case < 0: case >100: Console.WriteLine($"Measured value is ; out of an acceptable range."); break; default: Console.WriteLine($"Measured value is ."); break; > >
В операторе switch элемент управления не может переходить от одного раздела коммутатора к следующему. Как показано в примерах этого раздела, обычно в конце каждого раздела switch используется оператор break для передачи управления из оператора switch . Вы также можете использовать операторы return и throw, чтобы передать управление из оператора switch . Чтобы имитировать такое поведение ветви и передать управление другому разделу switch, можно использовать оператор goto .
В контексте оператора можно использовать оператор switch , чтобы вычислить одно выражение из списка кандидатов на основе сопоставления шаблона с выражением.
Охранные условия
Шаблон ветви может недостаточно полно выражать условие выполнения раздела switch. В этом случае можно использовать условие ветви. Это дополнительное условие, которое должно выполняться помимо соответствия шаблону. Условие случая должно быть логическим выражением. Охранное условие указывается после ключевого слова when , идущего за шаблоном, как показано в следующем примере.
DisplayMeasurements(3, 4); // Output: First measurement is 3, second measurement is 4. DisplayMeasurements(5, 5); // Output: Both measurements are valid and equal to 5. void DisplayMeasurements(int a, int b) < switch ((a, b)) < case (>0, > 0) when a == b: Console.WriteLine($"Both measurements are valid and equal to ."); break; case (> 0, > 0): Console.WriteLine($"First measurement is , second measurement is ."); break; default: Console.WriteLine("One or both measurements are not valid."); break; > >
В предыдущем примере используются шаблоны положений со вложенными шаблонами отношений.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
См. также
- справочник по C#
- Условный оператор ?:
- Логические операторы
- Шаблоны
- Выражение switch
- Добавление отсутствующих случаев для переключения инструкции (правило стиля IDE0010)
Чем отличается if от else if
(PHP 4, PHP 5, PHP 7, PHP 8)
Конструкция elseif , как её имя и говорит есть сочетание if и else . Аналогично else , она расширяет оператор if для выполнения различных выражений в случае, когда условие начального оператора if эквивалентно false . Однако, в отличие от else , выполнение альтернативного выражения произойдёт только тогда, когда условие оператора elseif будет являться равным true . К примеру, следующий код может выводить a больше, чем b , a равно b или a меньше, чем b :
if ( $a > $b ) echo «a больше, чем b» ;
> elseif ( $a == $b ) echo «a равен b» ;
> else echo «a меньше, чем b» ;
>
?>?php
Может быть несколько elseif в одном выражении if . Первое выражение elseif (если оно есть) равное true будет выполнено. В PHP вы также можете написать else if (в два слова), и тогда поведение будет идентичным elseif ‘ (в одно слово). Синтаксически значение немного отличается (то же поведение, что и у C), но в конечном итоге оба выражения приведут к одному и тому же результату.
Выражение elseif выполнится, если предшествующее выражение if и предшествующие выражения elseif эквивалентны false , а текущий elseif равен true .
Замечание: Заметьте, что elseif и else if будут равнозначны только при использовании фигурных скобок, как в примерах выше. Если используются синтаксис с двоеточием для определения условий if / elseif , возникает необходимость использования elseif в одном слове. Если разбить else if на два слова, PHP выдаст ошибку разбора.
/* Некорректный способ: */
if( $a > $b ):
echo $a . » больше, чем » . $b ;
else if( $a == $b ): // Не скомпилируется.
echo «Строка выше вызывает фатальную ошибку.» ;
endif;
/* Корректный способ: */
if( $a > $b ):
echo $a . » больше, чем » . $b ;
elseif( $a == $b ): // Заметьте, тут одно слово.
echo $a . » равно » . $b ;
else:
echo $a . » не больше и не равно » . $b ;
endif;
Оператор if-else (C++)
Оператор if-else управляет условным ветвлением. Операторы в объекте if-branch выполняются только в том случае, если condition значение ненулевого значения (или true ). Если значение condition ненулевого значения, выполняется следующая инструкция, а оператор, следующий за необязательным else , пропускается. В противном случае следующая инструкция пропускается, а если есть else оператор после else выполнения.
condition выражения, которые оцениваются как ненулевое:
- true
- указатель, отличный от NULL,
- любое арифметическое значение ненулевого или
- Тип класса, определяющий однозначное преобразование в арифметический, логический или указательный тип. (Сведения о преобразованиях см. в разделе Стандартные преобразования.)
Синтаксис
init-statement :
expression-statement
simple-declaration
condition :
expression
attribute-specifier-seq необ. decl-specifier-seq declarator brace-or-equal-initializer
statement :
expression-statement
compound-statement
expression-statement :
expression необ. ;
selection-statement :
if constexpr opt 17 opt 17 opt 17 ( init-statement condition ) if-branch
if constexpr opt 17 opt 17 opt 17 ( init-statement condition ) if-branch else else-branch
17 Этот необязательный элемент доступен начиная с C++17.
Операторы if-else
Во всех формах инструкции if , которая может иметь любое значение, condition кроме структуры, оценивается, включая все побочные эффекты. Элемент управления передается из if инструкции в следующую инструкцию в программе, если не выполняется if-branch или else-branch не содержится break , continue или goto .
Предложение else инструкции if. else связано с ближайшим предыдущим if оператором в той же область, которая не имеет соответствующего else оператора.
Пример
В этом примере кода показаны несколько if инструкций, используемых как с, так и без else :
// if_else_statement.cpp #include using namespace std; int main() < int x = 10; if (x < 11) < cout else < cout // no else statement bool flag = false; if (flag == true) < x = 100; // not executed >int *p = new int(25); if (p) < cout else < cout >
Значение if с инициализатором
Начиная с C++17 оператор также может содержать выражение, if которое объявляет и инициализирует именованную init-statement переменную. Используйте эту форму инструкции if, если переменная требуется только в область инструкции if.. Корпорация Майкрософт: эта форма доступна начиная с Visual Studio 2017 версии 15.3 и требует по крайней мере параметра компилятора /std:c++17 .
Пример
// Compile with /std:c++17 #include #include #include #include #include using namespace std; map m< , , >; mutex mx; bool shared_flag = true; // guarded by mx int getValue() < return 42; >int main() < if (auto it = m.find(10); it != m.end()) < cout second if (int x = getValue(); x == 42) < cout if (lock_guard lock(mx); shared_flag) < cout string s< "if" >; if (auto keywords = < "if", "for", "while" >; any_of(keywords.begin(), keywords.end(), [&s](const char* kw) < return s == kw; >)) < cout >
ten x is 42 setting shared_flag to false Error! Token must not be a keyword
Значение
Начиная с C++17, можно использовать инструкцию if constexpr в шаблонах функций, чтобы принимать решения о ветвлениях во время компиляции, не прибегая к нескольким перегрузкам функций. Корпорация Майкрософт: эта форма доступна начиная с Visual Studio 2017 версии 15.3 и требует по крайней мере параметра компилятора /std:c++17 .
Пример
В этом примере показано, как условно скомпилировать шаблон на основе типа, отправленного в него:
// Compile with /std:c++17 #include template auto Show(T t) < //if (std::is_pointer_v) // Show(a) results in compiler error for return *t. Show(b) results in compiler error for return t. if constexpr (std::is_pointer_v) // This statement goes away for Show(a) < return *t; >else < return t; >> int main() < int a = 42; int* pB = &a; std::cout
Инструкция if constexpr вычисляется во время компиляции, и компилятор создает код только для if ветви, которая соответствует типу аргумента, отправленного шаблону функции. Если вы закомментируете инструкцию if constexpr и раскомментируете if инструкцию, компилятор создает код для обеих ветвей. Это означает, что вы получите ошибку:
- Если вы вызываете ShowValue(a); ошибку return *t , так как t не является указателем, даже если if инструкция имеет значение false, и код никогда не выполняется.
- Если вы вызываете ShowValue(pB); ошибку return t , так как t это указатель, несмотря на if то, что оператор имеет значение true, и код никогда не выполняется.
Использование if constexpr этой проблемы решается, так как компилируется только инструкция, соответствующая типу аргумента, отправленного шаблону функции.
42 42
elseif/else if
Конструкция elseif, как ее имя и говорит есть сочетание if и else. Аналогично else, она расширяет оператор if для выполнения различных выражений в случае, когда условие начального оператора if эквивалентно FALSE . Однако, в отличии от else, выполнение альтернативного выражения произойдет только тогда, когда условие оператора elseif будет являться равным TRUE . К примеру, следующий код может выводить a больше, чем b , a равно b or a меньше, чем b :
if ( $a > $b ) echo "a больше, чем b" ;
> elseif ( $a == $b ) echo "a равен b" ;
> else echo "a меньше, чем b" ;
>
?>?php
Может быть несколько elseif в одном if выражении. Первое же выражение elseif (если будет хоть одно) равное TRUE будет выполнено. В PHP вы также можете написать 'else if' (в два слова), и тогда поведение будет идентичным 'elseif' (в одно слово). Синтаксически значение немного отличается (если Вы знакомы с языком С, это тоже самое поведение), но в конечном итоге оба выражения приведут к одному и тому же результату.
Выражение elseif выполнится, если предшествующее выражение if и предшествующие выражения elseif эквивалентны FALSE , а текущий elseif равен TRUE .
Замечание: Заметьте, что elseif и else if будут равнозначны только при использовании фигурных скобок, как в примерах выше. Если используются двоеточие для определения условий if/elseif, Вы не должны разделять else if в два слова, иначе это вызовет фатальную ошибку в PHP.
/* Некорректный способ: */
if( $a > $b ):
echo $a . " больше, чем " . $b ;
else if( $a == $b ): // Не скомпилируется.
echo "Строка выше вызывает фатальную ошибку." ;
endif;
/* Корректный способ: */
if( $a > $b ):
echo $a . " больше, чем " . $b ;
elseif( $a == $b ): // Заметьте, тут одно слово.
echo $a . " равно " . $b ;
else:
echo $a . " не больше и не равно " . $b ;
endif;