Чем отличается if от else if
Перейти к содержимому

Чем отличается if от else if

  • автор:

Операторы выбора — 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» ;
>
?>

Может быть несколько 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" ;
>
?>

Может быть несколько 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;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *