Почему блоки "одного оператора" не требуют использования полуколоней?
Я обычно программист на С#, и в Delphi полно "интересных" открытий. Тот, который больше всего меня озадачивает, - это одиночные заявления в Delphi.
Пример С# block
if(x)
Foo();
else
Bar();
Пример Delphi:
if x then
Foo() //note missing semicolon
else
Bar();
Какова была их цель требовать, чтобы полуколона не была там? Есть ли историческая причина, относящаяся к Паскалю?
Ответы
Ответ 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-стиле. И компилятор все еще меня задевает, вы бы подумали, что компилятор уже узнал бы.