Почему блоки "одного оператора" не требуют использования точек с запятой? - PullRequest
18 голосов
/ 27 сентября 2011

Я обычно программист на C #, и поездка в Delphi была полна "интересных" открытий.Больше всего меня сбивает с толку отдельные высказывания в Delphi.

Пример блока C #

if(x) 
  Foo();
else
  Bar();

Пример блока Delphi:

if x then
  Foo() //note missing semicolon
else
  Bar();

Какова была их цель запретить использование точки с запятой?Есть ли историческая причина, восходящая к Паскалю?

Ответы [ 2 ]

31 голосов
/ 27 сентября 2011

Существует разница между точками с запятой в Паскале и в Си и их производными.

  • В C точка с запятой является оператором terminator .
  • В Паскале точка с запятой - это оператор separator .

Википедия объясняет последствия этого:

Эта разница проявляется в основном в двух ситуациях:

  • в Паскале никогда не может быть точки с запятой в то время как это обязательно в C (если только не используется оператор block)
  • последний оператор перед концом не обязательно должен сопровождаться точка с запятой

лишнюю точку с запятой можно поставить в последнюю строку перед концом, тем самым формально вставляя пустое утверждение.

27 голосов
/ 28 сентября 2011

Реальная причина, по которой ; не допускается перед if-then else, заключается в том, чтобы избежать двусмысленности с менее известным родственником, case-of else.

Соблюдайте следующий фрагмент.

case enum1 of
  male: writeln('hallo');
  female: if a=1 then writeln('oops');  <<-- watch this space.
  else writeln('neither')
end; 

Поскольку после строки oops стоит ;, else принадлежит оператору case, а не if. Если вы пропустите ;, остальное принадлежит a = 1 if.

Вот почему ; не разрешен перед if else.

Лично проработав в Паскале около 20 с лишним лет, я все же поставил ; перед остальными, потому что я поставил ; в стиле Си. И компилятор все еще дает мне ошибку, можно подумать, что компилятор уже научился бы.

...