Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Условные операторы

Примеры реализации условных операторов в некоторых языках программирования. Языки C, C++, Java, C#, Perl, PHP, D:

if (условие)
{
   операторы
}
else
{
   операторы
}
Algol, Pascal:
if условие then
   begin
     операторы
   end
else
   begin
     операторы
   end
Phyton:
if условие:
   операторы
else:
   операторы
Ruby:
if условие
   операторы
else
   операторы
endif
Euphoria:
if условие then
   операторы
else
   операторы
end if
            Синтаксический сахар виден невооружённым взглядом. Ключевые слова «begin» и «end» вычёркиваем из языка своей мечты. Совершенно не нужен «then», его тоже исключаем. Условный оператор легко вписывается в «симметричный скобочный» стиль:
( if условие
       операторы
else
       операторы )
            Надо заметить, что некоторые языки программирования имеют оператор «elseif» или «elif». Его назначение — проверить ещё одно условие внутри данного условного выражения. Например, так:
if a = 1
   b := 0
elseif a = 2
   c := 1
elseif a = 3
   d := 2
else
   b := -1
endif
            Отказываться от такой дополнительной проверки неразумно, но какое ключевое слово выбрать: «elseif» или «elif»? Предложение такое: ни то, ни другое. Можно взять вышестоящее ключевое слово, а именно «if». Дело в том, что первому «if», начинающему условное выражение, предшествуюет открывающая скобка, а вот последующие «if» (там где в других языках употребляется «elseif») этой скобки впереди себя не имеют.

            Что имеем в итоге? Ранее мы решили, что синтаксический сахар должен быть заменён графическим, который возникает «сам по себе» при вводе текста. И в итоге имеем в IDE примерно следующее (не ищите большого смысла в этом якобы коде, приведённое ниже — иллюстрация, пример отображения этого кода):

(       if a == b  
        a = 0  
  b = 1
(       if c == d  
        c += 2  
  d /= 2  
         else  
 
(       if a == d  
        c = a + b  
  d = d * 3 + c
(       if c > d  
        b = d + c * 2  
  c *= b * d + 1 )
 
  c += b  
         else  
  c *= b + 2 )
 
  c += 3 )
 
        if a > b           // Здесь оператор if аналогичен традиционному else if  
        a = b * 4  
  b /= 4  
         else  
  b *= 2 )

            Как видите, получилась очень неплохая замена синтаксическому сахару. Вложенные блоки выделяются другим фоном (как один из вариантов). Смысл этих нововведний очень прозрачен, большинству программистов его не придётся объяснять.

            Стоит так же отметить, что предложенный синтаксис условного оператора решает проблему «висячего else», на которую обратил внимание Никлаус Вирт:
if условие 1
   ...
if условие 2
   ...
else
   ...
К какому «if» относится «else»? Вирт предлагает использовать «end» для окончания таких конструкций. Наше предложение короче, надо заканчивать конструкции закрывающей скобкой.

Последняя правка: 2016-05-15    18:47

ОценитеОценки посетителей
   █████████████████████ 2 (50%)
   ▌ 0
   █████████████████████ 2 (50%)
   ▌ 0

Отзывы

     2013/04/14 09:59, Михаил

В модуле, обероне, аде нет составного оператора begin end.
Там конструкции вида if elsif elsif ... [else] end.
Составной оператор не является синтаксическим сахаром это суровая необходимость для таких языков как Pascal, C, C++ и многих других. это особенность грамматики этих языков.

     2013/04/14 15:20, Автор сайта

Да, в Си и Паскале – это суровая необходимость. В Си без фигурных скобок невозможно выполнить сразу несколько действий в операторе «if»: if (…) {оператор_1; … оператор_N}, без скобок выполнился бы только первый оператор. Но это не значит, что без составного оператора нельзя обойтись. Си и Паскаль в этом плане – жертвы неудачных задумок их авторов. Язык Питон ярко доказывает, что операторные скобки – это всё-таки синтаксический сахар.

Насчёт Модулы, Ады и Оберона – учёл, спасибо.

     2013/11/16 12:36, Noname

В Форт (Forth)
<флаг_условия> IF слова_true_условия ELSE слова_false_условия THEN

     2015/01/23 23:25, rst256

( if условие ...

может быть потенциально опасной конструкцией. В случае, если в синтаксисе языка найдется пара токенов, способных валидно соединится как end_expr + begin_stat, так и expr + end_expr. Программисту будет весело :-)
Помните у C/C++ был висячий else?

     2015/01/25 15:38, Автор сайта

Почему «был»? Он до сих пор есть! О нём нельзя говорить только в прошедшем времени. О нём можно уверенно говорить в будущем времени! Новые языки типа Go или Rust вполне успешно имеют у себя висячий else. Можно с уверенностью предсказать, что он будет и в ещё неродившихся языках. Готов держать пари!
Могли бы привести пример опасной конструкции «(if …»?

     2016/04/16 11:08, rst256

Могли бы привести пример опасной конструкции «(if …»?

Каким образом? Эта конструкция содержит в себе как минимум все конструкции уровня "блок кода", а то и уровня "функции" (если они об. 1го класса). Дайте описания синтаксиса всех входящих в нее конструкций, я попробую дать ответ.

     2016/04/16 12:19, rst256

А насчет висячего else вы правы, разрешение неоднозначности тут делается "костылем", оказывается нельзя слепо верить стандартам языка, запомнил что де-юре проблемам решена, но де-факто она таки да, осталась:

Эта неоднозначность разрешается в языке Си с помощью правила, в соответствии с которым часть else оператора всегда относится к синтаксически самому правому, игнорируя любые отступы, оператору if без части else. Следовательно, первая интерпретация является интерпретацией, принятой в языке Си.

Был у меня один веселый случай
if() some() else ...
А some был макросом оператора if без части else... Отдаю предпочтение в данном вопросе синтаксису языка lua:
if ... then 
do -- это не цикл, do-end операторные скобки, только для работы со scope
while ... do ... end 
end
...
elseif ... then ...
else
x=5+5+5
print(x, 7, function() end)
end
Блок else тут содержит реальный код, синтаксис не нуждается в разделителе операторов (по желанию можно ставить ";" но это сахар), а выражение может содержать анонимную функцию.

     2015/04/16 15:48, Автор сайта

А then зачем нужен? Это же мусор. Условный оператор вида (if ... else ...) исключает все неоднозначности.

     2016/11/02 10:25, rst256

А then зачем нужен? Это же мусор. Условный оператор вида (if ... else ...) исключает все неоднозначности.

Неоднозначности да, но скобка в начале это то же мусор, и усложняет исправление ошибок типа "пропущена скобка...".

     2017/02/02 16:50, Михаил

Лишить автора сахара! Операторные скобки улучшают понятность и читабельность кода.

     2017/05/03 08:59, rst256

Лишить автора сахара! Операторные скобки улучшают понятность и читабельность кода.

В тех языках, где они есть, их польза несомненна. Но в языках без операторных скобок понятность и читабельность кода гораздо выше. Как понятнее так
if(...){...}
if(...){...}else{...}
или так
if ... then ... end
if ... then ... else ... end
?
Способ соединить несколько операций в одну в виду того, что циклы, условия и прочие конструкции принимают изначально только одну операцию? Или же конструкции, которые изначально были рассчитанные на работу с несколькими операциями, что логичнее?

P.S. Если не ошибаюсь для одиночных операций сейчас тоже принято использовать операторные скобки. Так, на всякий пожарный...

     2017/05/18 11:29, Автор сайта

для одиночных операций сейчас тоже принято использовать операторные скобки.

В языке Rust операторные скобки обязательны.

     2017/09/21 00:32, Comdiv

Плохое решение. Забыл о скобках у вложенного условного оператора – и он оказывается частью объемлющего. Вы, конечно, рассчитываете на IDE, которая расставит отступы, но зависимость от IDE – это тоже плохое решение. Там же отделение условия от операторов переводом строки.

     2017/09/21 23:05, Автор сайта

Да, «elseif» хоть и можно заменить на «if» при скобочном обособлении ветвей, но без среды разработки это и вправду будет создавать проблемы. С «elseif» – надёжнее.

     2017/11/05 15:39, rst256

Почему «был»? Он до сих пор есть! О нём нельзя говорить только в прошедшем времени. О нём можно уверенно говорить в будущем времени! Новые языки типа Go или Rust вполне успешно имеют у себя висячий else. Можно с уверенностью предсказать, что он будет и в ещё не родившихся языках. Готов держать пари!

Хорошо давайте поспорим, что я уберу висячий else, просто переставив один символ. Вот наглядный пример вреда исключений в синтаксисе, т.к. код в операторных скобках обрабатывается также, как единичное действие, то и синтаксис его должен быть таким же, как у всех единичных действий, а именно:
 <некое действие> ';'
Теперь в условном операторе код блока "тогда" оканчивается разделителем тогда, когда ветвь "иначе" опущена. И для вящего порядка разделитель после последнего действия внутри в операторных скобок убираем в ввиду его бессмысленности (что впрочем не мешает при желании его там использовать, пустую операцию ';' ведь никто не отменял).

Пример:
if( !v ){ printf(fmt, v); v=0;return(v);  };
if( !v ){ printf(fmt, v) } else { v=v+1; return(v) };

if( !v ) return(null);
if( v ) printf(fmt, v) else return(v);

if( !v ) ; /* если тут пропустить разделитель то нижестоящий блок будет присоединен к данному условию. */

{ printf(fmt, v); v=0;return(v); };
{ printf(fmt, v); v=0;return(v) };
Описание грамматики для парсера packcc:
statements <- 
( _ statement _ ';' )+

statement <-
block
/ callstat { printf("callstat: %s\n", $0); }
/ call { printf("call: %s\n", $0); }
/ assign
/ define_var_stat


ifstat <-
'if' _ '(' _ expression _ ')' _ statement _ 'else' _ statement
/ 'if' _ '(' _ expression _ ')' _ statement
/ 'if' _ '(' _ expression _ ')'


block <-
'{' _ statement _ ( ';' _ statement _ )* ';'? _ '}' { printf("block: %s: %d %d\n", $0, $0s, $0e); }


assign <-
< ident > _ '=' _ < expression >


define_var_stat <-
te:type_expr _ ':' _ ( assign / < IDENT > )
Исходник целиком доступен по ссылке https://github.com/rst256/packcc_lc/blob/master/lc.cc

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Устарел ли текст как форма представления программы

Русский язык и программирование

Многоязыковое программирование

Синтаксис языков программирования

Синтаксический сахар

Некоторые «вкусности» Алгол-68

«Двухмерный» синтаксис Python

Почему языки с синтаксисом Си популярнее языков с синтаксисом Паскаля?

Должна ли программа быть удобочитаемой?

Стиль языка программирования

Тексто-графическое представление программы

●  Разделители

●  Строки программы

●  Слева направо или справа налево?

Комментарии

●  Длинные комментарии

●  Короткие комментарии

●  Комментарии автоматической генерации документации

●  Нерабочий код

Нужны ли беззнаковые целые?

Шестнадцатиричные и двоичные константы

Условные операторы

Переключатель

Циклы

●  Продолжение цикла и выход из него

Некошерный «goto»

Операции присвоения и проверки на равенство. Возможно ли однаковое обозначение?

Так ли нужны операции «&&», «||» и «^^»?

Постфиксные инкремент и декремент

Почему в PHP для конкатенации строк используется «.»?

Указатели и ссылки в C++

Использование памяти

Почему динамическое распределение памяти – это плохо

Как обеспечить возврат функциями объектов переменной длины?

●  Типы переменного размера (dynamically sized types, DST) в языке Rust

●  Массивы переменной длины в C/C++

●  Размещение объектов в стеке, традиционный подход

●  Размещение объектов переменной длины с использованием множества стеков

●  Размещение объектов переменной длины с использованием двух стеков

●  Реализация двухстековой модели размещения данных

●  Двухстековая модель: тесты на скорость

●  Размещение объектов переменной длины с использованием одного стека

Можно ли забыть о «куче», если объекты переменной длины хранить в стеке

Безопасность и размещение объектов переменной длины в стеке

Массивы, структуры, типы, классы переменной длины

О хранении данных в стеке, вместо заключения

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Прочее

Последние комментарии

2018/04/16 15:09, Олег
Русский язык и программирование

2018/04/02 22:42, rst256
Программирование без программистов — это медицина без врачей

2018/03/25 21:14, Денис Будяк
Энтузиасты-разработчики компиляторов и их проекты

2018/03/21 23:37, Marat
Почему обречён язык Форт

2018/03/10 20:05, Comdiv
«Двухмерный» синтаксис Python

2018/02/24 14:51, Эникейщик
Русской операционной системой должна стать ReactOS

2017/12/12 13:32, Comdiv
Отечественные разработки

2017/11/05 17:26, rst256
Электроника без электронщиков