Подтвердить что ты не робот

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

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

Пример С# block

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

Пример Delphi:

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

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

4b9b3361

Ответ 1

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

  • В C точка с запятой - это терминатор утверждения.
  • В Паскале точка с запятой - разделитель операторов.

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

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

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

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

Ответ 2

Настоящая причина ; не допускается перед 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. Если вы оставите ;, то else будет принадлежать a = 1 if.

То, почему a ; не разрешено перед if else.

Лично работая в Pascal в течение примерно 20 с лишним лет, я все еще ставил ; перед другим, потому что я положил ; в C-стиле. И компилятор все еще меня задевает, вы бы подумали, что компилятор уже узнал бы.