Объяснение синтаксиса PHP, C ++ и др. - PullRequest
5 голосов
/ 09 сентября 2010

Почему в большинстве языков программирования требуется ставить точку с запятой после операторов, но не после таких вещей, как if elseif и else?

Все ли компиляторы высматривают переводы строк? Если это правда, то почему бы им не сделать это для всех заявлений?

Я что-то упустил? Это действительно не имеет смысла для меня ...

Ответы [ 6 ]

11 голосов
/ 09 сентября 2010

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

2 голосов
/ 10 сентября 2010

Это относится к разнице между утверждениями и выражениями.Такие языки, как C, требуют, чтобы блок содержал серию операторов.Структуры потока управления, такие как if и while, являются собственными операторами:

void foo() {
    if (bar) {
        /* ... */
    }
    while (baz) {
        /* ... */
    }
}

Здесь не нужно использовать точки с запятой, поскольку все, что внутри foo(), является оператором.Вопрос в том, что если вам нужно выражение типа bar() в месте, где ожидается утверждение?Грамматика C говорит, что вы можете сделать это, добавив точку с запятой после выражения (другими словами, выражение, за которым следует ; - это утверждение).

Итак, это недопустимо:

void foo() {
    1 + 2
}

Потому что 1 + 2 является выражением.Вы должны превратить его в утверждение:

void foo() {
    1 + 2;
}

Чтобы полностью понять, что происходит, важно отметить, что блок (что-то в curly, как { foo(); } также является оператором, и что грамматика дляif выглядит примерно так:

if ( <condition> ) <statement> (else <statement>)?

Вот почему if операторы могут иметь блоки для тел или отдельных операторов: блок является отдельным оператором.

2 голосов
/ 09 сентября 2010

Некоторые компиляторы игнорируют пробелы и используют точку с запятой для определения операторов, таких как присвоение переменных и блоки кода if {}.

Другие языки, такие как python, используют пробелы для поиска операторов и блоков if.

2 голосов
/ 09 сентября 2010

Поскольку компиляторы для этих языков не учитывают пробелы для завершения операторов.Утверждение должно быть завершено каким-то образом, и это делается с помощью точки с запятой.Вы можете написать весь код (хотя это было бы ужасно, ужасно) в одну строку, если вы правильно завершаете операторы.

1 голос
/ 10 сентября 2010

Исходный код - это набор операторов. Мы должны разграничить утверждения, используя разделители. Если мы используем новую строку в качестве разделителя, мы не можем структурировать наши коды. Очень длинные строки будут читаться только при прокрутке. (чтобы избежать прокрутки, длинные строки обычно разделяются.) Например:

ParserUtils.RefreshProperty(m_cfg.PORTAL_ID, ParserUtils.CreateHashFromUrl(strDetailLinkUrl), Convert.ToInt32(m_cfg.Type), strPrice, strAddress, strStreet, strPostCode, strFeatures, strDescription, strImgFile, strBedrooms, strReception, strBath, strStatus, strLink, strPropType, strOutside, strTenure, strKeywords, strFullText, strContactInfo, m_ieBrowser.URL);

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

    ParserUtils.RefreshProperty(m_cfg.PORTAL_ID,
    ParserUtils.CreateHashFromUrl(strDetailLinkUrl),
    Convert.ToInt32(m_cfg.Type), strPrice,
    strAddress, strStreet, strPostCode, strFeatures, strDescription, strImgFile,
    strBedrooms, strReception, strBath, strStatus, strLink, strPropType,
    strOutside, strTenure, strKeywords, strFullText, strContactInfo,
    m_ieBrowser.URL);

Это было бы невозможно, если бы символ новой строки был разделителем. If s, while s и for s были бы полным беспорядком, если оператором новой строки был оператор. Рассмотрим этот код:

for (int i = 0; i < n; i++)
    {
        if (i % 2 == 0)
        {
            System.out.println("It can be divided by two");
        }
        {
            System.out.println("It can't be divided by two");
        }
    }

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

for (int i = 0
     i < 0
     i++) { if (i % 2 == 0) { System.out.println("It can be divided by two")
                          } { System.out.println("It can't be divided by two")
                          } }

Этот код трудно читать, и он логически допустим в качестве разделителя. Например, моя жена пишет мои задачи на бумаге (алгоритм) так:

Buy food(Bread, Meat, Butter),
Go and pay the taxes,
Call your mother, because she wants to talk to you

Эти задачи разделяются запятыми, но обратите внимание, что параметры также разделяются запятыми. Мы должны различать запятую как разделитель параметров и запятую как разделитель задач, потому что компьютер не такой умный, как люди. В заключение разделитель задач - это большая запятая, чем разделитель параметров. Вот почему разделитель операторов - это точка с запятой, а разделитель параметров - запятая.

1 голос
/ 09 сентября 2010

Зачем использовать ';'вместо '\ n' для завершения оператора.

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

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

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

Почему не все утверждения являются пробелами

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

...