C ++中的分号是什么?

时间:2011-06-24 06:56:18

标签: c++

粗略地说,在C ++中有运算符(+-*[]new...),标识符(类的名称,变量,函数,...),常量文字(102.5"100",...),一些关键字(int,{{ 1}},classtypename,...),括号(mutable{}<),预处理器( ># ...)。但是分号是什么?

11 个答案:

答案 0 :(得分:14)

分号是标点符号,见2.13§1

  

C ++程序的词汇表示包括许多用于的预处理标记   预处理器的语法或转换为运算符和标点符号

的标记

答案 1 :(得分:12)

它是语法的一部分,其中包含几个语句的元素。在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> ';'

此列表不完整。请看我的评论。

答案 2 :(得分:8)

分号是一个终端,一个终止某事的标记。它终止的确切取决于上下文。

答案 3 :(得分:7)

Semicolon是一个声明终止符。

答案 4 :(得分:5)

分号表示顺序组合。它还用于描述声明。

答案 5 :(得分:1)

分号在C ++标准中没有给出特定名称。它只是在某些语法产生中使用的一个字符(它恰好经常出现在它们的末尾,所以它'终止'那些语法结构)。例如,分号字符位于C ++语法的以下部分的末尾(不一定是完整列表):

  • expression-statement
  • a do / while iteration-statement
  • 各种jump-statement s
  • simple-declaration

请注意,在expression-statement中,表达式是可选的。这就是为什么“运行”分号;;;;在许多(但不是全部)单个地方有效的原因。

答案 6 :(得分:0)

分号让编译器知道它已到达命令AFAIK的末尾。

答案 7 :(得分:0)

分号(;)是C ++中的命令。它告诉编译器你在命令的末尾。

答案 8 :(得分:0)

';经常用于分隔一位C ++源代码,表明它有意与以下代码分开。为了了解它是如何有用的,让我们假设我们没有使用它:

例如:

#include <iostream>

int f() { std::cout << "f()\n"; }
int g() { std::cout << "g()\n"; }

int main(int argc)
{
    std::cout << "message"

    "\0\1\0\1\1"[argc] ? f() : g();  // final ';' needed to make this compile
                                     // but imagine it's not there in this new
                                     // semicolon-less C++ variant....
} 

这个(可怕的)代码被调用,没有参数,argc1,打印出来:

ef()\n

为什么不“messagef()\ n”?这是首先std::cout << "message"给出的,然后"\0\1\0\1\1"[1]'\1' - true的布尔意义 - 建议调用f()打印{{1} }?

因为......(鼓号)...在C ++中相邻的字符串文字被连接起来,所以程序的解析如下:

f()\n

这是做什么的:

  • 在“message \ 0 \ 1 \ 0 \ 1 \ 1”中找到std::cout << "message\0\1\0\1\1"[argc] ? f() : g(); (第二个)字符,这是第一个'e'
  • 将'e'发送到[argc/1](打印)
  • 三元运营商'?'触发将std::cout转换为生成std::cout的{​​{1}}(因为打印可能有效),因此bool被称为......!

鉴于此字符串文字串联对于指定长字符串非常有用 (甚至可读格式的更短的多行字符串),我们当然不希望假设这些字符串不应该连接。因此,如果分号消失,那么编译器必须假定连接是有意的,即使在视觉上上面代码的布局暗示不是这样。

这是一个令人费解的例子,说明C ++代码如何改变和改变意义。我敢肯定,如果我或其他读者想到它几分钟,我们可以提出其他 - 更简单 - 的例子。

无论如何,';'是必要通知编译器语句终止/分离是意图。

答案 9 :(得分:0)

如果我没记错的话,Kernighan和Ritchie称它为标点符号。 从技术上讲,它只是一个令牌(或编译器说话的终端),它 可以出现在语法中的特定位置,具有特定的语义 在语言中。运算符和其他标点符号之间的区别 有点人为,但在C或C ++的上下文中很有用,因为 一些令牌(,=:)可以是运算符或标点符号, 取决于具体情况,例如:

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

在前两个的情况下,区别很重要,因为用户 定义的重载只会影响运算符,而不会影响标点符号。

答案 10 :(得分:0)

它表示C ++语句的结束。

例如,

 int i=0;
 i++;

在上面的代码中有两个陈述。第一个用于声明变量,第二个用于将变量值递增1。