Языки , как C, Java и C ++ все требуют скобки вокруг всего выражения при использовании в if
, while
или switch
.
if (true) {
// Do something
}
в отличие от
if true {
// Do something
}
Это кажется мне странным, потому что круглые скобки излишни. В этом примере true
это отдельное выражение само по себе. Скобки не меняют его значение никоим образом, я знаю. Почему существует этот странный синтаксис и почему он так распространен? Есть ли польза от этого, о которой я не знаю?
THEN
).if
утверждения, они просто создают составное утверждение.Ответы:
Должен быть какой-то способ сказать, где кончается условие и начинается ветвь. Есть много разных способов сделать это.
В некоторых языках нет условными вообще , например , в Smalltalk, Self, новояз, Ио, Ioke, SEPH и Fancy. Условное ветвление просто реализуется как обычный метод, как и любой другой метод. Метод реализован на логических объектах и вызывается на логических объектах. Таким образом, условие является просто получателем метода, а две ветви являются двумя аргументами, например, в Smalltalk:
В случае, если вы более знакомы с Java, это эквивалентно следующему:
В семействе языков Lisp ситуация аналогична: условные выражения - это просто нормальные функции (на самом деле, макросы), а первый аргумент - это условие, второй и третий аргументы - это ветви, поэтому они являются просто обычными аргументами функции, и есть ничего особенного не нужно для их разграничения:
Некоторые языки используют ключевые слова в качестве разделителей, например, Algol, Ada, BASIC, Pascal, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal, Zonnon, Modula-3:
В Ruby вы можете использовать ключевое слово или разделитель выражений (точка с запятой или новая строка):
Go требует, чтобы ветви были блоками, и не допускает выражения или операторы, что делает фигурные скобки обязательными. Поэтому круглые скобки не требуются, хотя вы можете добавить их, если хотите; Perl6 и Rust похожи в этом отношении:
Некоторые языки используют другие не буквенно-цифровые символы для ограничения условия, например, Python:
Суть в следующем: вам нужен какой-то способ сказать, где заканчивается условие и начинается ветвь. Есть много способов сделать это, скобки - только один из них.
источник
Скобки не нужны, только если вы используете скобки.
Например становится двусмысленным без них.
источник
if
: базового, ассемблера, python, bash / zsh, tcl, batch, brainfuck или машинного кода. Отсутствие скобок делаетif
двусмысленным, только если язык был разработан, чтобы зависеть от них.if Condition then ...
.{}
обязательными и, следовательно, не требует скобок вокруг выражения. Мало того, что парены не требуются, но если я правильно помню, добавление паренов может привести к ошибке компиляции - они запрещеныКруглые скобки в
if
выражении не имеют того же значения, что и круглые скобки, используемые в арифметическом выражении. Круглые скобки в арифметическом выражении используются для группировки выражений вместе. Круглые скобки вif
выражении используются для разделения логического выражения; то есть, чтобы отличить логическое выражение от остальной частиif
оператора.В
if
операторе круглые скобки не выполняют функцию группировки (хотя внутриif
инструкции вы все равно можете использовать круглые скобки для группировки арифметических выражений. Внешний набор скобок затем служит для разграничения всего логического выражения). Их обязательное выполнение упрощает компилятор, поскольку компилятор может полагаться на те круглые скобки, которые всегда присутствуют.источник
IF primary_expression statement
. Обратите внимание, что последнее одинаково однозначно.primary_expression
нельзя отличить от префиксного оператора в выражении-выражении. Чтобы скопировать ответ Теластинаif true ++ x;
. Кроме того, если существуют пустые операторы, ониif a & f;
могут быть либо пустым оператором и двоичным кодом&
внутри условия, либо унарным&
в начале оператора. Но при сопоставлении скобок для открытия есть ровно одно совпадение (IDENTIFIER
,CONSTANT
,STRING_LITERAL
и'(' expression ')'
.Как другие уже частично указали, это связано с тем, что выражения также являются допустимыми операторами, и в случае блока с одним оператором вы можете удалить фигурные скобки. Это означает, что следующее неоднозначно:
Потому что это можно интерпретировать как:
вместо:
Ряд языков (например, Python) позволяют вам избегать скобок, но все же имеют маркер конечного условия:
Однако вы правы в том, что мы могли бы определить язык, в котором скобки никогда не требуются: язык, где выражение не является допустимым выражением, не будет иметь этой проблемы.
К сожалению, это означает, что такие вещи, как:
бы не быть действительным заявлением, так что вы должны были бы ввести некоторые странный синтаксис , чтобы иметь возможность выполнять такие действия , не создавая выражения. Простой способ сделать это - просто добавить выражение к маркеру, например
[statement]
:Теперь неопределенность исчезает, так как вам придется написать:
Но, как вы можете видеть, я не вижу такого языка широко распространенным, поскольку ставить скобки вокруг
if
-условия (или:
его в конце) гораздо лучше, чем ставить такой маркер для каждого выражения выражения.Примечание : использование
[statement]
маркера - это самый простой синтаксис, который я мог придумать. Однако у вас может быть два совершенно разных синтаксиса для выражений и операторов, без двусмысленности между ними, которые не требуют такого маркера. Проблема в том, что язык был бы очень странным, потому что для выполнения одних и тех же вещей в выражении или в выражении вы должны использовать совершенно другой синтаксис.Одна вещи , которая приходит на ум , чтобы иметь два отдельные синтаксиса без таких явных маркеров будет, например: заявления заставляют использовать юникод символы (так что вместо
for
вас бы использовать некоторые юникод изменение буквf
,o
аr
), в то время как выражения , чтобы быть Только ASCII.источник
discard
его значение в Nim . Однако это сделано только для безопасности типов, а не по синтаксическим причинам.?
например, simbol - это функция после PP). Существует нет;
. Конечно, нужен маркер для продолжения линии, но это не рекомендуется. harbour.github.io/doc/clc53.html#if-cmd . Компилятор быстрый и простой (создан с помощью Bison / Flex).if
,while
ЕСС ограничены по сравнению с родовыми выражений , используемых в других языках. Конечно: если у вас есть более двух синтаксических категорий (например, выражение, выражение, логическое выражение, выражение для приготовления кофе, ...), вы можете торговать некоторой свободой.Для языков семейства C характерны такие скобки, но они не универсальны.
Одним из наиболее заметных синтаксических изменений Perl 6 является то , что они изменили грамматику так , что вы не должны давать круглые скобки
if
,for
и условиям аналогичных заявлений. Итак, что-то вроде этого совершенно справедливо в Perl 6:как есть
Однако, поскольку они являются просто выражениями, вы можете заключить их в круглые скобки, если хотите, и в этом случае они являются просто обычными группирующими вместо требуемой части синтаксиса, как в C, C #, Java и т. Д.
В Rust синтаксис похож на Perl 6 в этом отделе:
Мне кажется, что особенность более современных языков, основанных на C, состоит в том, чтобы смотреть на подобные вещи и удивляться их удалению.
источник
if
или циклических конструкций с БЛОКАМИ требуются скобки, например, вif ( $x == 4 ) { ... }
илиforeach my $foo ( @bar ) { ... }
. Когда используется постфиксная нотация, паренсы необязательны, как вreturn unless $foo;
или++$x while s/foo/bar/g;
.Есть один аспект, который меня удивляет, что ни один из существующих ответов не возник.
C, и многие производные от C и аналогичные, имеет особенность в том, что значением присваивания является присвоенное значение. Следствием этого является то, что назначение может использоваться там, где ожидается значение.
Это позволяет вам писать такие вещи, как
или же
или же
(что неявно трактуется как то,
while (n < m && *p1++ = *p2++ != 0) { n++; }
что C рассматривает ненулевое значение как true; кстати, я думаю, что это просто strncpy () в стандартной библиотеке C)или даже
и все это действительно. Не все синтаксически допустимые комбинации обязательно полезны (и современные компиляторы специально предупреждают о присваиваниях внутри условных выражений, потому что это распространенная ошибка), но некоторые из них действительно полезны.
Разбор таких утверждений, вероятно, был бы гораздо более сложным, если бы не было однозначного способа определить, где начинается и заканчивается условное выражение.
Круглые скобки уже использовались для отделения имен функций от аргументов функций, поэтому я думаю, что они казались естественным выбором и для разделения ключевых слов от аргументов ключевых слов.
Конечно, альтернативные синтаксисы могут быть определены, чтобы сделать то же самое. Но это увеличило бы сложность, особенно в синтаксическом анализаторе, который затем должен был бы иметь дело с двумя различными наборами синтаксиса для почти одной и той же вещи. В то время, когда разрабатывался C, вычислительная мощность (как с точки зрения способности к сокращению чисел, рабочей памяти и емкости памяти) была крайне ограничена; все, что уменьшало сложность при минимальных затратах или вообще не приводило к читабельности, почти наверняка было долгожданным изменением.
Использование скобок сегодня может показаться немного архаичным, но это не так, если кто-то знаком с языком, это ухудшает читабельность по сравнению с другим синтаксисом, способным выражать те же вещи.
источник
Причина в основном история.
В то время, когда был написан первый компилятор C, на компьютерах были очень ограничены ram, cpu и компиляторы, где они были написаны «вручную» с несколькими инструментами, помогающими разработчикам компиляторов. Поэтому сложные правила были дорогостоящими для реализации в компиляторе. C ++, C #, Java и т. Д. Были разработаны так, чтобы программистам C было легко их освоить, поэтому «ненужных» изменений не было.
В языках «c like» условные выражения (
if, while, etc
) не требуют явногоblock
отключения кода, вы можете просто использовать простое утверждение.или вы можете объединить заявления в один
compound statement
, поместив их в{}
Нам нравится, когда компилятор находит ошибку, которую мы совершаем, и выдает сообщение об ошибке, которое мы можем понять.
источник
Java и C ++ были разработаны после того, как C стал очень популярным языком программирования. Одно из соображений при разработке каждого из этих языков заключалось в том, что он будет привлекать программистов на С и привлекать этих программистов к использованию нового языка. (Я был одним из программистов на Си, которых они успешно добились.) Кроме того, C ++ был разработан так, чтобы (почти) взаимозаменяться с кодом C. Для поддержки этих целей, как C ++ и Java приняли большую часть синтаксиса языка C, в том числе круглых скобок вокруг условий
if
,while
иswitch
заявления.Следовательно, причина того, почему все эти языки требуют скобок вокруг условий этих утверждений, заключается в том, что C делает, и вопрос в том, почему C требует эти скобки.
Происхождение языка Си описано в этой статье Деннисом Ритчи, одним из главных авторов его разработки (некоторые могут даже сказать, что основным автором его разработки). Как сказано в этой статье, C был изначально разработан в начале 1970-х годов как язык системного программирования для компьютеров с чрезвычайно ограниченным пространством в основной памяти. Было желательно иметь язык более высокого уровня, чем ассемблер, но, учитывая ресурсы, доступные для работы, простота синтаксического анализа языка также была важна. Требование скобок позволит относительно легко идентифицировать условный код.
Можно также сделать вывод, что способность писать программы с использованием меньшего количества символов считалась преимуществом, и две круглые скобки занимают меньше места, чем ключевое слово,
THEN
которое использовалось в то время в FORTRAN и других языках высокого уровня; фактически, поскольку круглые скобки могут также заменять пробелы в качестве разделителей символов, наif(a==b)
четыре целых символа короче, чемIF a==b THEN
.В любом случае необходимо было найти некоторый баланс между тем, насколько легко люди смогут читать, писать и понимать программы, написанные на C, как легко компилятор может анализировать и компилировать программы, написанные на C, и сколько килобайт (!) потребуется как для исходного кода программы, так и для самого компилятора. И круглые скобки вокруг условий
if
,while
иswitch
заявлений было то, как люди решили ударить , что баланс в конструкции С.Как видно из нескольких других ответов, как только вы уберете конкретные обстоятельства, при которых разрабатывался язык C, для условных выражений различных языков программирования использовались все виды альтернативных форм синтаксиса. Таким образом, скобки на самом деле сводятся к проектному решению, которое было принято несколькими людьми с определенными ограничениями в определенный момент истории.
источник
Многие здесь считают, что без скобок синтаксис был бы неоднозначным и молчаливо подразумевали, что это будет как-то плохо или даже невозможно.
На самом деле, у языков есть много способов справиться с неясностями. Приоритет оператора - только один из примеров этой темы.
Нет, двусмысленность не является причиной для скобок. Я думаю, что можно просто создать версию C, которая не требует скобок вокруг условия (что делает их необязательными) и которая все еще создает действительный код во всех случаях. Пример
if a ++ b;
можно интерпретировать как эквивалентныйif (a) ++b;
илиif (a++) b;
, что кажется более подходящим.Вопрос о том, почему Деннис Ритчи решил сделать () обязательным (и, следовательно, придумать этот мем для большого количества производных языков), довольно лингвистический. Я предполагаю, что идея ясно заявить, что условие является выражением, а не командой, была отцом мысли.
И на самом деле, C был разработан для анализа с использованием однопроходного синтаксического анализатора. Использование синтаксиса с обязательными круглыми скобками вокруг условия поддерживает этот аспект.
источник
Скобки вокруг
if
условий не требуются в Фортране, Коболе, PL / 1, Алголе, Алго-68, Паскале, Модуле, XPL, PL / M, MPL, ... или любом другом языке, имеющемthen
ключевое слово.then
служит для отделенияcondition
от следующегоstatement
.Закрывающая скобка в C и т. Д. Функционирует как
then
, а открывающая скобка формально избыточна.Приведенные выше замечания относятся к традиционно анализируемым языкам.
источник