Что такое точка с запятой в 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

точка с запятой позволяет компилятору знать, что он достиг конца команды AFAIK.


точка с запятой (;) - это команда на языке 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++;

В приведенном выше коде есть два заявления. Во-первых, для объявления переменной, а второй-для увеличения значения переменной на единицу.