Что такое точка с запятой в C++?
грубо говоря, в C++ есть операторы (+ , - * [] new ...)
идентификаторы (имена классов, переменных, функций...), const literals (10, 2.5, "100",...)
, несколько ключевых слов (int, class, typename, mutable, ...)
, скобки ({ } < > )
, препроцессор (#, ## ...)
. Но что такое точка с запятой?
11 ответов
точка с запятой-это punctuator см. 2.13 §1
лексическое представление программ C++ включает в себя ряд токенов предварительной обработки, которые используются в синтаксис препроцессора или преобразуются в токены для операторов и знаки пунктуации
Это часть синтаксиса и в нем элемент несколько заявлений. В EBNF:
<do-statement>
::= 'do' <statement> 'while' '(' <expression> ')' ';'
<goto-statement>
::= 'goto' <label> ';'
<for-statement>
::= 'for' '(' <for-initialization> ';' <for-control> ';' <for-iteration> ')' <statement>
<expression-statement>
::= <expression> ';'
<return-statement>
::= 'return' <expression> ';'
этот список неполон. Пожалуйста, см. Мой комментарий.
точка с запятой-это терминал, знак, что что-то заканчивается. Что именно он завершает зависит от контекста.
точка с запятой обозначает последовательную композицию. Он также используется для выделения объявления.
точка с запятой не имеет определенного имени в стандарте C++. Это просто символ, который используется в некоторых грамматических произведениях (и это просто случается в конце их довольно часто, поэтому он "завершает" эти грамматические конструкции). Например, точка с запятой находится в конце следующих частей грамматики C++ (не обязательно полный список):
- an
expression-statement
точка с запятой (;) - это команда на языке C++. Он сообщает компилятору, что вы находитесь в конце команды.
'; ' часто используются для разграничения одного бита исходного кода C++, указывая, что он намеренно отделен от следующего кода. Чтобы увидеть, насколько это полезно, давайте представим, что мы не использовали его:
например:
#include <iostream>
int f() { std::cout << "f()\n"; }
int g() { std::cout << "g()\n"; }
int main(int argc)
{
std::cout << "message"
""[argc] ? f() : g(); // final ';' needed to make this compile
// but imagine it's not there in this new
// semicolon-less C++ variant....
}
этот (ужасный) бит кода, вызванный без аргументов, таких, что argc
is 1
, принты:
ef()\n
почему не "messagef ()\n"? Это то, что можно было бы ожидать, учитывая первый std::cout << "message"
, потом ""[1]
будучи ''
- true
в a логический смысл - предполагает вызов f()
печати f()\n
?
потому что... (барабанная дробь)... в C++ смежные строковые литералы объединены, поэтому программа разбирается следующим образом:
std::cout << "message"[argc] ? f() : g();
это:
- найти
[argc/1]
(второй) символ в "сообщение\0\1\0\1\1", который является первым 'e' - отправить 'e' для
std::cout
(печать) - тернарный оператор '?'триггеры литье
std::cout
дляbool
которая производитtrue
(потому что печать, вероятно, работала), так чтоf()
называется...!
учитывая, что эта конкатенация строковых литералов невероятно полезна для указания длинных строк (и даже более короткие многострочные строки в удобочитаемом формате), мы, конечно, не хотели бы предполагать, что такие строки не должны быть объединены. Следовательно, если точка с запятой исчезла, компилятор должен предположить, что конкатенация предназначена, хотя визуально макет приведенный выше код подразумевает иное.
это запутанный пример того, как код C++ С и без ';'S изменяет значение. Я уверен, что если я или другие читатели подумают об этом в течение нескольких минут, мы могли бы придумать другие - и более простые - примеры.
во всяком случае,'; ' это необходимые сообщить компилятору, что оператор termination/separation предназначен.
,, =
и :
) может быть операторами или пунктуацией,
в зависимости от контекста, например:
f( a, b ); // comma is punctuation
f( (a, b) ); // comma is operator
a = b; // = is assignment operator
int a = b; // = is punctuation
x = c ? a : b; // colon is operator
label: // colon is punctuation
в случае первых двух, различие важно, так как пользователь определенная перегрузка будет влиять только на оператора, а не на пунктуацию.
Он представляет собой конец оператора C++.
например,
int i=0;
i++;
В приведенном выше коде есть два заявления. Во-первых, для объявления переменной, а второй-для увеличения значения переменной на единицу.