2015-03-01 2 views
3

В C++, почему нам нужна точка с запятой перед закрытием скобки? Странно, что-то вродеЗачем нужна точка с запятой перед закрытием скобки?

{ 
    statement; 
    statement; 
    statement 
} 

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

+3

Из-за того, как выражение определяется в грамматике. Просто как тот. – Spo1ler

+5

Зачем вводить специальное правило для выражения, предшествующего закрывающей скобке? – chris

+0

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

ответ

4

Вот как определяется грамматика C++. Точка с запятой используется для преобразования выражения в заявление:

statement = expression ';' 

Например:

a = 1; 

a = 1 это выражение, поставить дополнительную ; и у вас есть заявление, которое может быть выполнено.

Аналогично, объявление переменной или типа должно заканчиваться точкой с запятой:

struct S { int x; }; 

Однако функции определения и утверждения блока не заканчиваются с ;:

int main() {} 

Вы можете быть удивлены, потому что у вас есть фон Pascal. В Pascal точка с запятой используется для разделения операторов, поэтому вам не нужен последний. Однако, если вы хотите написать 2 последовательных оператора блока, на C++ вы пишете {...} {...}, а в Паскале вам нужна точка с запятой: begin ... end; begin ... end.

0

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

+0

Это всего лишь круговой аргумент. – EJP

0

Это необходимо, чтобы компилятор знал, когда прекратить выполнение этой строки кода. Даже если это последняя строка кода перед закрывающей скобкой.

Представьте, что вы пишете эссе. Вы оставляете последнее предложение каждого абзаца без переполнения? Иметь смысл?

+0

Хороший аргумент, но в Python, он делает) – se0808

+0

Это также законно в Паскале. – EJP

2

C++ использует ; для определения конца инструкции.

Например, вы можете написать код, как этот

Statement;statement;statement; 

The { } указывает объем вашего текущего оператора.

Например:

{ int a(0);} //a "dies" at the } 
    a = 1; //error a is not found in current scope 
3

Это хорошо известное различие в теории языка программирования, терминаторы и разделители. Если точка с запятой была бы разделителем, вам не понадобится последняя. C выбрать использовать терминаторы и C++ унаследовал то, что Pascal использует разделители

Однако оказалось, что терминаторы - лучший выбор. Программисты делают меньше ошибок с терминаторами, чем с разделителями. (Gannon & Horning, Влияние языкового дизайна на производство надежного программного обеспечения.Материалы международной конференции по надежному программному обеспечению 1975).

Смежные вопросы