Операторы выбора — 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 (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
Чем отличается 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;
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;