Є "інше якщо" одним ключовим словом?


100

Я новачок у С ++. Я часто бачу умовне твердження, як нижче:

if 
  statement_0;
else if
  statement_1;

Питання:

Синтаксично , чи слід розглядати це else ifяк одне ключове слово? Або це насправді вкладене ifтвердження у зовнішньому, elseяк нижче?

if 
  statement_0;
else 
  if
    statement_1;

5
До другого моменту. Синтаксично це майже завжди написаноelse if
TheNorthWes

8
Ні, як це зробило б граматику ще складнішою: слово - це слово без пробілу. Інші мови, хоча мають ключові слова, як elseifі ELIF. Насправді лише (?) Мова програмування Algol68 дозволяє пробіл в ідентифікаторі; приємно також:PROC walk through tree ()
Joop Eggen

3
Fortran (принаймні, версії з фіксованою формою) та всі стандартизовані версії Algol дають пробіли в будь-якому місці. Одна історія говорить про те, що, мабуть, перфоратори на перфокартах були схильні до додавання пробілів під час введення коду; Інший просто, що надання пробілів у змінних імен дозволить програмістам використовувати кращі імена, а проблеми не передбачалися.
профілі

1
elseifКлючове слово існує в VB і PHP.
Салман

3
Нітпік: хоча офіційно у C ++ немає ключових слів із пробілами, у нього є такі конструкції, як для всіх намірів і цілей, які працюють саме так. Наприклад, long doubleви повинні написати це таким чином. longdoubleневірно.
Містер Лістер,

Відповіді:


133

Вони не одне ключове слово , якщо ми йдемо в проект C ++ стандартний розділ 2.12 Ключові слова таблиці 4списків як ifі по elseокремо , і немає else ifключових слів. Ми можемо знайти більш доступний список ключових слів C ++ , перейшовши до розділу cppreferences щодо ключових слів .

Граматика в розділі 6.4також це ясно:

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

ifУ else ifце заяву після elseтерміна. У розділі також сказано:

[...] Підзаголовок у виписці-операторі (кожен підзаголовок, в іншому вигляді оператора if ) неявно визначає область блоку (3.3). Якщо підзаголовок у виділенні-операторі - це одне твердження, а не складене твердження , воно є так, як якщо б воно було переписане як складене твердження, що містить початковий підзаголовок.

і надає наступний приклад:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

То як розбирається твій трохи розширений приклад?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

будемо аналізувати так:

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

Примітка

Ми також можемо визначити, що else ifне може бути одним ключовим словом, зрозумівши, що ключові слова є ідентифікаторами, і ми можемо бачити граматику для ідентифікатора у моїй відповіді на " Чи можна почати ім'я класу з числової цифри?" що пробіли не допускаються в ідентифікаторах, і тому вони else ifне можуть бути одним ключовим словом, але повинні бути двома окремими ключовими словами .


1
Ви могли це зробити без стандартного? В ASM його: jeq( if| else if), jne( if| else if), jmp( else). Виходячи з цього, я б сказав, що це було одне ключове слово. Мабуть, не синтаксично, а з урахуванням інструкцій.
Брендон

18
@Brandon Я дуже сумніваюся, що ви могли надійно перейти від мови складання до конструкцій високого рівня без інтимних знань про граматику, що використовується, і сам компілятор.
Шафік Ягмур

Хоча зауважте, що це визначення потенційно призводить до чудової неоднозначної проблеми з синтаксисом «
звисання

2
Деякі мови не підтримують else if, але натомість elsif. У цих мовах else ifсправді одне ключове слово. Однак мови, що базується на С, як правило, немає, як зазначено у цій відповіді.
sfdcfox

1
Я думаю, @Krumia хотів побачити остаточну elseзаяву. Я б також оцінив це.
Маттіас

78

Синтаксично це не одне ключове слово; Ключові слова не можуть містити пробілів. Логічно, коли ви пишете списки else if, мабуть, краще, якщо ви бачите це як одне ключове слово і пишете:

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

Компілятор буквально бачить це:

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

але обидві форми виходять одне і те ж, і перша набагато читабельніша.


1
Насправді компілятор не побачив буквально elseслідом за a compound-statement. Після else, він шукає statement(який може бути як return;або f()) або compound-statement...
Маска

@TheMask: Відповідь Шафіка Ягмора вище, компілятор буквально бачить одне твердження, але робить вигляд, що бачив складне твердження.
Ільмарі Каронен

Ця відповідь диктує, як парсер вилучає лексеми. Добре.
хакі

24

Ні, це не так.
Вони є двома ключовими словами і, крім того, друге "якщо" - це підзаголовок "всередині" сфери, визначеної першим висловом "else".


2
Хоча це добре описує те, що відбувається, ви можете додати деякі посилання на фактичні визначення мови, щоб краще підтвердити те, що ви говорите.
πάντα ῥεῖ

2
@ πάνταῥεῖ: Ви маєте рацію щодо посилань, але Шафік Ягмур цю роботу ще добре зробив. Його відповідь була прийнятою, і я також проголосував. Моя робота тут закінчена.
pablo1977

16

Ви можете побачити область, скориставшись фігурними дужками:

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

І зазвичай реалізується з двома різними ключовими словами, одне - якщо, а інше - .


Отже, я вважаю, що ті, хто наполягає на тому, що фігурні дужки повинні використовуватися там, де приймається складна заява, повинні писати всі свої нетривіальні умови, як це, так? :)
dlf

5
Я думаю, що можна переборщити що завгодно, навіть усі наші улюблені фігурні брекети. Не робіть цього вдома.
північний олень

1
Усі структуровані дужки мови (які я знаю), які вимагають фігурних дужок навколо всіх підрепортажів, навіть якщо вони складаються з одного твердження, мають ключове слово з однозначним значенням зі значенням "else if". Я думаю, що це говорить.
zwol

@Zack: Swift - це мова, яка порушує ваше правило. Він вимагає фігурних дужок навіть для блоків коду з одним твердженням, але не має ключового слова "ще якщо". З іншого боку, граматика сильно відрізняється від C. if-statementЗакінчується факультативом else-clause. else-clauseЄ або else code-block чи else if-statement. code-blockвключає обов'язкові брекети. Тож за elseключовим словом може дотримуватися лише {або if.
GraniteRobert

@GraniteRobert Я навіть не встиг сам подивитися на Свіфта, але це цікавий момент даних; Я думав, що така граматика є можливою, але ніколи не бачила цього. І ви зауважите, що це також уникає того, щоб люди писали " else { if ... }".
zwol

10

Як уже відповіли, це не так. Вони є двома ключовими словами. Це початок з двох тверджень, що слідують один за одним. Щоб спробувати зробити це більш зрозумілим, ось граматика BNF, яка стосується ifі elseзаяви на мові C ++.

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

Зверніть увагу, що в statementсебе включають selection-statement. Отже, комбінації типу:

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

можливі та дійсні відповідно до стандарту / семантики C ++.

Примітка: C ++ граматики взяти з цієї сторінки.


1

інше, і якщо це два різні ключові слова C ++ . За твердженням if може слідувати необов'язковий інший, якщо ... else оператор. Якщо оператор може мати нуль або більше іншого , якщо «s і вони повинні прийти до іншого .

Ви можете знайти синтаксис та приклад у цьому, якщо ... else навчальний посібник із заявою


-1

Я просто хотів би додати свою точку зору до всіх цих пояснень. Як я бачу, якщо ви можете використовувати ці ключові слова окремо, вони повинні бути ДВОМИ ключовими словами. Можливо, ви можете подивитися на граматику c ++ за цим посиланням у stackoverflow: Чи є стандартна граматика C ++?

З повагою


-1

Оператору if може бути додано необов'язкове інше if ... else оператор, що дуже корисно для тестування різних умов, використовуючи single, якщо ... else if оператор.

При використанні тверджень if, else if, else є кілька пунктів, які слід пам’ятати.

Значення "if" може мати нуль або один інший, і воно має відбуватися після будь-якого іншого, якщо є.

Якщо if може мати нуль до багатьох інших if, і вони повинні прийти раніше.

Якщо це вдасться, ні один із них, якщо він залишився, не буде перевірений.

подивіться, якщо ... ще навчальний посібник із заявою .


2
Це просто не відповідає стандарту, а крім того, є зайвим. Мова має всю виразну силу імітувати else ifтак, ніби це було ключове слово, тому не було б сенсу чітко визначати її.
Руслан

1
Це корисне спрощення для програмістів. Але питання не запитує, як використовувати, якщо заяви.
Cruncher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.