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

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

  • автор:

Директивы #if, #elif, #else и #endif (C/C++)

Директива #if с директивами #elif, #else и #endif управляет компиляцией частей исходного файла. Если написанное выражение (после #if) имеет ненулевое значение, группа строк сразу после директивы #if хранится в модуле перевода.

грамматики

if-line :
#if констант-выражение
идентификатор #ifdef
идентификатор #ifndef

elif-parts :
текст с элифовой линией
текст elif-parts elif-line

elif-line :
#elif констант-выражение

else-part :
Текст в другой строке

else-line :
#else

endif-line :
#endif

Замечания

Каждая директива #if в исходном файле должна соответствовать закрывающей директиве #endif . Любое количество директив #elif может отображаться между директивами #if и #endif , но в большинстве случаев допускается одна директива #else . Директива #else, если она присутствует, должна быть последней директивой перед #endif.

Директивы #if, #elif, #else и #endif могут вложены в текстовые части других директив #if. Каждая вложенная директива #else, #elif или #endif принадлежит ближайшей предыдущей директиве #if.

Все директивы условной компиляции, такие как #if и #ifdef, должны соответствовать закрывающей директиве #endif до окончания файла. В противном случае создается сообщение об ошибке. Если директивы условной компиляции содержатся во включаемых файлах, они должны удовлетворять одинаковым условиям: в конце включаемого файла не должно оставаться непарных директив условной компиляции.

Замена макросов выполняется в части строки, которая следует #elif команде, поэтому вызов макроса можно использовать в констант-выражении.

Препроцессор выбирает один из указанных вхождения текста для дальнейшей обработки. Блок, указанный в тексте , может быть любой последовательностью текста. Он может занимать несколько строк. Обычно текст — это программный текст , который имеет значение для компилятора или препроцессора.

Препроцессор обрабатывает выделенный текст и передает его компилятору. Если текст содержит директивы препроцессора, препроцессор выполняет эти директивы. Компилируются только текстовые блоки, выбранные препроцессором.

Препроцессор выбирает один текстовый элемент, оценивая константное выражение после каждой #if или директивы #elif, пока не находит истинное (ненулевое) константное выражение. Он выбирает весь текст (включая другие директивы препроцессора, начиная с#) до связанного #elif, #else или #endif.

Если все вхождения констант-выражения являются ложными или если директивы #elif не отображаются, препроцессор выбирает блок текста после предложения #else. Если нет предложения #else, а все экземпляры константного выражения в блоке #if имеют значение false, текстовый блок не выбран.

Константное выражение — это целочисленное константное выражение с этими дополнительными ограничениями:

  • Выражения должны иметь целочисленный тип и могут включать только целые константы, константы символов и определенный оператор.
  • Выражение не может использовать sizeof или оператор приведения типа.
  • Целевая среда может не представлять все диапазоны целых чисел.
  • Перевод представляет тип так же, как и тип intlong , и тот же способ, что unsigned long и unsigned int .
  • Транслятор может преобразовывать символьные константы в набор кодовых значений, отличающийся от набора для целевой среды. Чтобы определить свойства целевой среды, используйте приложение, созданное для этой среды, для проверка значений LIMITS. Макросы H.
  • Выражение не должно запрашивать среду и оставаться изолированным от сведений о реализации на целевом компьютере.

Операторы препроцессора

архитектура

Определяемый оператор препроцессора можно использовать в специальных константных выражениях, как показано в следующем синтаксисе:

defined(identifier)
определенныйидентификатор

Это константное выражение считается истинным (ненулевое), если идентификатор определен в данный момент. В противном случае условие не выполняется (false, значение равно 0). Идентификатор, определенный как пустой текст, считается определенным. Определенный оператор можно использовать в #if и директиве #elif, но нигде.

В следующем примере директивы #if и #endif управляют компиляцией одного из трех вызовов функций:

#if defined(CREDIT) credit(); #elif defined(DEBIT) debit(); #else printerror(); #endif 

Вызов функции credit компилируется, если определен идентификатор CREDIT . Если определен идентификатор DEBIT , компилируется вызов функции debit . Если ни один из этих идентификаторов не определен, компилируется вызов функции printerror . Оба CREDIT и credit являются уникальными идентификаторами в C и C++, так как их варианты отличаются.

В следующем примере в операторах условной компиляции используется ранее определенная символьная константа с именем DLEVEL .

#if DLEVEL > 5 #define SIGNAL 1 #if STACKUSE == 1 #define STACK 200 #else #define STACK 100 #endif #else #define SIGNAL 0 #if STACKUSE == 1 #define STACK 100 #else #define STACK 50 #endif #endif #if DLEVEL == 0 #define STACK 0 #elif DLEVEL == 1 #define STACK 100 #elif DLEVEL > 5 display( debugptr ); #else #define STACK 200 #endif 

В первом блоке #if показаны два набора вложенных #if, #else и директив #endif. Первый набор директив обрабатывается только в том случае, если выполняется условие DLEVEL > 5 . В противном случае операторы после обработки #else .

Директивы #elif и #else во втором примере используются для выбора одного из четырех вариантов на основе значения DLEVEL . Константе STACK присваивается значение 0, 100 или 200 в зависимости от определения константы DLEVEL . Если DLEVEL больше 5, то компилируется оператор

#elif DLEVEL > 5 display(debugptr); 

компилируется и STACK не определен.

Условная компиляция обычно используется для предотвращения нескольких включений одного и того же файла заголовка. В C++, где классы часто определяются в файлах заголовков, такие как этот, можно использовать для предотвращения нескольких определений:

/* EXAMPLE.H - Example header file */ #if !defined( EXAMPLE_H ) #define EXAMPLE_H class Example < //. >; #endif // !defined( EXAMPLE_H ) 

Предыдущий код проверяет, определена ли символьная константа EXAMPLE_H . Если да, файл уже включен и не нуждается в повторной обработке. Если нет, константа EXAMPLE_H определяется, чтобы пометить файл EXAMPLE.H как уже обработанный.

__has_include

Visual Studio 2017 версии 15.3 и более поздних версий: определяет, доступен ли заголовок библиотеки для включения:

#ifdef __has_include # if __has_include() # include # define have_filesystem 1 # elif __has_include() # include # define have_filesystem 1 # define experimental_filesystem # else # define have_filesystem 0 # endif #endif 

Как работает оператор else if и в чем отличие от if?

Достаточно рассмотреть простой пример, чтобы понять, в чем заключается разница.

int x = 0; if ( x == 0 ) < System.out.printline( "x = " + x ); ++x; >else if ( x == 1 ) < System.out.printline( "x = " + x ); ++x; >else if ( x == 2 ) < System.out.printline( "x x = " + x ); ++x; >if ( x == 1 ) < System.out.printline( "x = " + x ); ++x; >if ( x == 2 ) < System.out.printline( "x mt24"> 
)" data-controller="se-share-sheet" data-se-share-sheet-title="Поделиться ссылкой на ответ" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-license-name="CC BY-SA 3.0" data-s-popover-placement="bottom-start">Поделиться
)" title="">Улучшить ответ
)">изменён 8 ноя 2016 в 12:25
Nick Volynkin
34k 25 золотых знаков 130 серебряных знаков 222 бронзовых знака
ответ дан 8 ноя 2016 в 11:40
Добавить комментарий |
9

Есть. Формат if/else if гарантирует, что при выполнении какого-либо из условий блоки с другими условиями не будут выполнены. При использовании цепочки if это не гарантируется. Например:

int a = 10; if( a > 1 ) System.out.println( "Переменная 'a' больше 1" ); if( a > 5 ) System.out.println( "Переменная 'a' больше 5" ); 

Будут выполнены оба блока, и выведется:

Переменная 'a' больше 1 Переменная 'a' больше 5 

Отслеживать
ответ дан 8 ноя 2016 в 11:39
9,066 14 14 серебряных знаков 26 26 бронзовых знаков

Как такового оператора else if нет, это лишь использование ещё одного if в ветке else другого if . Но разница между ними есть. В первом случае второе условие отработает, если не отработает первое, а третье - если не отработает второе. Во втором случае отработают все условия (если где-то не возникнет, скажем, исключение).

НО. Судя по вашему коду, условия у вас одинаковые. Поэтому в первом случае сработает тоьлко первый if или не сработает ничего. А во втором либо сработают все три if , либо не сработает ничего

Отслеживать
ответ дан 8 ноя 2016 в 11:39
DreamChild DreamChild
36.2k 3 3 золотых знака 45 45 серебряных знаков 85 85 бронзовых знаков

В рамках тэга «любой язык» высказывание как такового оператора . нет не совсем верно, ибо есть языки, которые выделяют на сей случай отдельной оператор в духе elseif

10 мая 2019 в 13:56

В if вы даёте условие и если оно не выполняется можете вызвать else . Но в случаях когда нужно проверять условие одно за одним можно использовать конструкцию else if . И тогда в else if вы вписание ещё одно условие .

 int x = 1; if(x==3)< System.out.println("Это число 5");//к сожелению не выведет >else if(x==2)< System.out.println("Это число 2");//к сожелению не выведет >else if(x==1)< System.out.println("Это число 1");//выведет вот это >else

Отслеживать
ответ дан 8 ноя 2016 в 12:14
107 1 1 серебряный знак 9 9 бронзовых знаков

Во втором случае у вас проверяются всегда все условия. В первом случае если выполнится первое условие остальные уже не проверяются

Отслеживать
ответ дан 8 ноя 2016 в 11:38
Воробьев Александр Воробьев Александр
1,176 6 6 серебряных знаков 14 14 бронзовых знаков

if (condition) statement; else if (condition) statement; else if (condition) statement; 

чаще всего применяется, когда нужно в зависимости от того, чему равно проверяемое значение, выполнить несколько вариантов действий. И вообще по-идее в таких ситуациях нужно пользоваться оператором ветвления ( switch\case\select и т.д). Но во многих языках он обладает неприятными ограничениями, которые заставляют пользоваться вышеупомянутой конструкцией. Зачем вставлять else , если логика последующих if такова, что проверку пройдёт только один? Чтобы избежать лишних проверок и явно указать читателю исходного кода, что здесь реализован по сути оператор ветвления.

В некоторых языках реализован специальный оператор elseif\elsif\elif позволяющий избегать лишнего вложения блоков.

Python: Конструкция else + if = elif

Функция get_type_of_sentence() различает только вопросительные и обычные предложения. Добавим в нее поддержку восклицательных предложений:

def get_type_of_sentence(sentence): last_char = sentence[-1] if last_char == '?': sentence_type = 'question' if last_char == '!': sentence_type = 'exclamation' else: sentence_type = 'normal' return 'Sentence is ' + sentence_type print(get_type_of_sentence('Who?')) # => 'Sentence is normal' print(get_type_of_sentence('No')) # => 'Sentence is normal' print(get_type_of_sentence('No!')) # => 'Sentence is exclamation' 

Мы добавили проверку восклицательных предложений — exclamation. Технически эта функция работает, но вопросительные предложения трактует неверно. Еще в ней есть проблемы с точки зрения семантики:

  • Наличие восклицательного знака проверяется в любом случае, даже если уже обнаружился вопросительный знак
  • Ветка else описана для второго условия, но не для первого. Поэтому вопросительное предложение становится "normal"

Чтобы исправить ситуацию, воспользуемся еще одной возможностью условной конструкции:

def get_type_of_sentence(sentence): last_char = sentence[-1] if last_char == '?': sentence_type = 'question' elif last_char == '!': sentence_type = 'exclamation' else: sentence_type = 'normal' return 'Sentence is ' + sentence_type print(get_type_of_sentence('Who?')) # => 'Sentence is question' print(get_type_of_sentence('No')) # => 'Sentence is normal' print(get_type_of_sentence('No!')) # => 'Sentence is exclamation' 

Теперь все условия выстроились в единую конструкцию. elif означает — «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема:

  • если последняя буква ? , то 'question'
  • если последняя буква ! , то 'exclamation'
  • остальные варианты — 'normal'

Выполнится только один из блоков кода, который относится ко всей конструкции if .

Задание

На электронной карте Вестероса, которую реализовал Сэм, союзники Старков отображены зелёным кружком, враги — красным, а нейтральные семьи — серым.

Напишите для Сэма функцию who_is_this_house_to_starks() , которая принимает на вход фамилию семьи и возвращает одно из трёх значений: 'friend' , 'enemy' , 'neutral' .

  • Друзья ( 'friend' ): 'Karstark' , 'Tully'
  • Враги ( 'enemy' ): 'Lannister' , 'Frey'
  • Любые другие семьи считаются нейтральными ( 'neutral' )
print(who_is_this_house_to_starks('Karstark')) # => 'friend' print(who_is_this_house_to_starks('Frey')) # => 'enemy' print(who_is_this_house_to_starks('Joar')) # => 'neutral' print(who_is_this_house_to_starks('Ivanov')) # => 'neutral' 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Определения

  • else + if = elif — способ задать несколько альтернативных условий.

В чем отличия между if и elif Python

В большинстве ЯП нет конструкции elif, потому что при множественном выборе можно сделать, например, так (C):
if( условие ) .
> else if (условие2 ) .
> else .
>
Но в Python такая конструкция будет увеличивать отступы (в C вместо отступов подчиненный блок берется в фигурные скобки). Поэтому ввели дополнительное слово elif, объединяющиее else и if без увеличения отступов.

Остальные ответы

else if идёт следом за if, что означает "в противном случае если".

можно же вместо elif использовать тот же if и в чем будет разница?

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

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