Какова логика использования знаков препинания C++?

Я пытаюсь понять логику использования знаков препинания в С++, особенно точки с запятой. Это мой прогресс до сих пор, с некоторыми вопросами:

  • Объявление вводит тип, класс или объект в область видимости, например. int i;
  • Выражение представляет собой последовательность операторов и операндов, например. a=i+1; i++;
  • Оператор — это выражение или объявление.

  • () Скобки группируют части выражения и окружают тесты, например. if(a==b), while(a==b), switch(myTestVal) и for(int i=0;i<5;i++)

  • {} Фигурные скобки определяют области действия и групповые операторы, а также списки инициализации для массивов, перечислений и структур, но почему НЕ классы! Кроме того, они необходимы в операторе switch, чтобы заключить его тело, чтобы разрыв знал, с чего продолжить.

  • , Запятые разделяют элементы в списке, например. список аргументов или список инициализации массива.

  • : Двоеточия используются после меток, например, после регистровой части оператора switch и для разделения частей оператора, например, в третичном операторе '?'.

    Однако ;, а не : используется для разделения частей оператора for, например. for(i=0;i<5;i++) — Почему это?

  • ; Точки с запятой завершают операторы (выражения и объявления), за исключением случаев, когда они заканчиваются ) или :, например. в тесте:(a==(c+b*d)) или списке аргументов.

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

И последняя странность: почему ; требуется после do...while?


person Gutzy    schedule 19.10.2011    source источник
comment
Обратите внимание, что запятая также является оператором.   -  person Oscar Korz    schedule 19.10.2011
comment
Не каждое соглашение всегда будет казаться логичным с человеческой точки зрения, поскольку компилятор должен иметь возможность выполнять свою работу, а исходный файл должен быть полностью однозначным. Но я, конечно же, хотел бы услышать, если кто-то знает интересные факты об этих конвенциях.   -  person G_H    schedule 19.10.2011
comment
Не такой уж плохой вопрос, как он задуман. Голосование за повторное открытие. Не вижу в этом настоящего вопроса.   -  person Alok Save    schedule 19.10.2011
comment
В for используются точки с запятой, потому что это три независимых выражения (выражение!=оператор). {} объявить области. Если у вас есть коммутатор в другом коммутаторе, {} уточняйте область действия каждого из них. Каждое выражение заканчивается на ;. Как и int var1, var2;, вы можете иметь class A {} var1, var2;, это декларативный оператор.   -  person Mooing Duck    schedule 19.10.2011
comment
Связанный: stackoverflow.com/questions/942251/   -  person Flexo    schedule 20.10.2011


Ответы (3)


Для окончательного ответа о том, как используются точки с запятой, см.:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf

См. Приложение А.

Что касается того, почему точки с запятой требуются там, где они кажутся избыточными, например.

struct A {};

На самом деле вы можете сказать:

struct A {} a;

Таким образом, между } и ; есть место, где вы можете по желанию поместить идентификатор. Отсюда необходимость более сложного синтаксиса.

Но не всякое несоответствие оправдывается общепризнанной «логикой». C++ наследует синтаксис от C, и оба языка имеют усовершенствованный синтаксис, который должен был вводить новые возможности, не нарушая большие основы существующего кода. Они несут шрамы этой эволюции.

person Daniel Earwicker    schedule 19.10.2011

Commas separate items in a list, e.g. an argument or initialisation list.
Да, но обратите внимание, что запятые также могут быть перегружены, чтобы делать абсурдные вещи. (Не делай этого)

Colons are used to separate parts of a statement
Да, двоеточие используется там, где запятая или точка с запятой неуместны. Это как "другой" токен. Не совсем уверен, почему цикл for использует точку с запятой в качестве разделителя (это выражения, а не операторы).

Braces group statements.
Нет, {} объявите области. Все, что находится внутри {}, не может быть замечено вещами за пределами {} без области видимости, например std::string или string a; a.begin(); (a является строкой и, таким образом, может обращаться к членам внутри области string). Области также проясняют вложенные переключатели и вложенные... что угодно.

switch(a) {
case 1:
case 2:
    switch(b) {
    case 3:
    case 4:
    }
case 5:
}

Semicolons terminate statements
Каждое выражение заканчивается на ;, кроме for и while. Верхняя часть цикла for содержит выражения, а не операторы. Вы не можете поставить while в декларации for. (как это это называется?) Да. Это очень запутанно.

However, a function or class implementation, is not a declaration
Да и нет. Функция — это определение, а не инструкция. Он не требует точки с запятой. Определение класса технически является частью оператора объявления переменной, поэтому оно действительно требует точки с запятой.

int a;  //declare a as an int
class A {} a; //declare a as an A class I just made
class {} a,b,c;  //declare a,b,c as unnamed class types
int;  //int exists
class A {};  //A exists
person Mooing Duck    schedule 19.10.2011

Для оператора switch, если бы не было фигурных скобок, как бы вы узнали, что последний case закончился и пришло время «продолжить после переключения»? Оператор break передает управление первой строке кода после переключателя. Скобки - единственный способ узнать, где это.

person Kate Gregory    schedule 19.10.2011