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

Почему языки C требуют парнов вокруг простого условия в выражении if?

Это звучит глупо, но за эти годы я не смог придумать вариант использования, который потребует этого. Быстрый поиск в Google не показал ничего полезного.

Из памяти был прецедент, упомянутый Бьярне Страуступом, но я не могу найти ссылку на него.

Итак, почему вы не можете иметь это на языках C:

int val = 0;
if val
  doSomehing();
else
  doSomehinglse();

Я могу согласиться с тем, что "мы не можем беспокоиться о добавлении поддержки для lexer", я просто хочу выяснить, нарушает ли этот синтаксис другие языковые конструкции. Рассматривая, сколько whacky синтаксических особенностей есть в C/С++, я вряд ли думаю, что это добавило бы много сложности.

4b9b3361

Ответ 1

Если в конструкциях if нет скобок вокруг выражений, что будет означать следующее утверждение?

if x * x * b = NULL;

Это

if (x*x)
    (*b) = NULL;

или это

if (x)
    (*x) * b = NULL;

(конечно, это глупые примеры и даже не работают по очевидным причинам, но вы понимаете)

TL;DR: в C требуется скобки, чтобы удалить даже любую синтаксическую двусмысленность.

Ответ 2

Расскажите, как измерить следующее:

if x ++ b;

Выглядит глупо, но...

if( x ) ++b;

или

if( x++ ) b;

или, возможно, "x" имеет перегруженный оператор, тогда...

if( x ++ b){;}

Edit:

Как отметил Мартин Йорк, "++" имеет более высокий приоритет, поэтому я должен был добавить оператор перегружать лакомый кусочек. Он абсолютно прав, имея дело с современными компиляторами, пока вы не допустите все, что перегружает доброту, которая поставляется с С++.

Ответ 3

Я думаю, что лучшим вопросом будет "зачем нам это хотеть?" чем "почему бы нам не сделать это?". Он вводит в лексер другой иначе ненужный край, просто чтобы вы могли не набирать 4 дополнительных символа; и добавляет сложности спецификации, позволяя исключениям простого синтаксиса, который уже полностью поддерживает все возможные случаи. Не говоря уже о том, что линия двусмысленности, которая на языке программирования не имеет большого значения.

Ответ 4

Еще одна возможная вещь, о которой следует помнить: C был создан в то время, когда хранилище на магнитной ленте было обычным явлением, поэтому случайный поиск или возврат назад по текущему файлу или даже другим файлам был невозможен (что также объясняет, почему вы должны поместите некоторые вещи (т.е. форвардные декларации) перед другими вещами (т.е. использование функций), даже если компилятор должен уметь это понять).

Ответ 5

Мне тоже понравился бы этот синтаксис, но чтобы избежать разбора амбивалентов, он должен быть такой формы:

для нескольких операторов:

if val 
{ 
    doSomething();
    doOthers();
}

для одного утверждения:

if val: 
   doSomething();

Ответ 6

Это просто средство для завершения условия условия инструкции. Другие языки используют другие средства, такие как "then" или "Python", если условие :( после чего возвращается) " (The: всегда получайте меня на python. Я оставляю их и получаю ошибки, чем не сразу видно в результате.)

Компьютерные грамматики обычно напоминают какой-то уникальный механизм, чтобы идентифицировать разные части выражения или выражения. Это не лучше или хуже в этом отношении, чем любой другой язык. Другая проблема, связанная с C/С++, является примером двусмысленности с точки зрения грамматики и должна рассматриваться как особый случай для обеспечения правильной работы. (т.е. добавляет дополнительную работу для разработчика компилятора.)

Ответ 7

если вам не требуется значительное свободное пространство, которое вам нужно, чтобы узнать, когда закончится условие на некоторых языках он() вокруг условия в некотором ключевом слове, тогда как если бы он был указан в ответе

если x * x * b = NULL может быть одним условием, всегда оценивающим значение false, при присвоении значения null в b в случае (xx) компилятор не знает, когда закончится условие и начинается следующая операция. Поэтому для компилятора должен быть явный "обратный маркер", чтобы узнать, когда закончится условие. В C (++), Java, С# и других языках он() маркирует условие в F # это ключевое слово "then", а на других языках это символ новой строки/отступа

Ответ 8

Основная причина в том, что у C и друзей нет ключевого слова "then", поэтому им нужен другой способ разграничения выражения условий. Языки, которые делают, например Pascal и PL/1, не нуждаются в круглых скобках. То же самое относится к "while", где Pascal, PL/1 и т.д. Имеют "сделать".

Ответ 9

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

Ответ 10

Я думаю, что вы путаете "скобки" с "скобками"

Это возможно в C:

void doSomething(){}
void doSomethingElse(){}

void main() {
    int val = 0;
    if( val ) 
        doSomething();
    else
        doSomethingElse();
}

Забастовкa >

Не все языки "C" заставляют использовать пасетезис и оставлять фигурные скобки как необязательные. Язык программирования Go (Issue) делает именно напротив.

Правильный способ написать то же предложение в Issue9:

if val {
    doSomething();
} else {
    doSomethingElse();
}

Таким образом, недопустимо следующее:

if x * x * b = NULL; 

Он должен быть одним из:

if x*x {
    *b=NULL;
}

или  если x {      XB = NULL;  }

Здесь фигурные скобки устраняют двусмысленность, создаваемую отсутствием скобок.

Ответ 11

Я могу привести, по крайней мере, один пример, почему в C есть паранезия вокруг условий,

Например, рассмотрим следующее

while(1) do_something();

Вышеупомянутое вызовет do_something() навсегда в бесконечном цикле

Причина, по которой требуется парентит, состоит в том, что следующее будет двусмысленным.

while 1 ; do_something(); означает ли это, оценивать do_something и ничего не делать в цикле while? или это означает то же, что и пример кода выше?

Я предполагаю, что это показывает один из способов, почему в синтаксисе синтаксиса C требуются оценки условий, и, расширяя один и тот же синтаксис (ради удобства), он распространяется на операторы if.

Discalaimer: я мог бы быть совершенно неправым, и причина, связанная с тем, что pranthesis может быть совершенно другим, но, по крайней мере, я показал один пример того, как это может быть полезно

Ответ 12

Я не могу думать о каких-либо конкретных случаях, когда опускание парнов фактически вызывало бы какую-либо двусмысленность, но, вероятно, есть где-то в углу.

Он может быть связан с локально объявленными переменными (как в if (bool b = foo())..., где без круглых скобок, было бы труднее определить, является ли bool объявлением типа или всем условием. В последнем случае b будет первым маркером тела if-statements, а не частью условия.

Ответ 13

Потому что C позволяет делать:

if (x) { // As opposed to java where you need to do if (x == something)
   // your code
}

Как вы можете видеть выше, гибкость дает двусмысленность, как показали другие.