c++标点符使用的逻辑是什么?

What is the logic of C++ punctuator usage?

本文关键字:是什么 c++      更新时间:2023-10-16

我试图辨别c++中标点符号使用背后的逻辑,特别是分号。这是我到目前为止的进展,还有一些问题:

  • 将类型、类或对象引入作用域的声明,例如int i;
  • 表达式是操作符和操作数的序列,例如a=i+1; i++;
  • 语句是一个表达式或声明。

  • ()表达式的括号组部分和环绕测试,例如if(a==b), while(a==b), switch(myTestVal)for(int i=0;i<5;i++)

  • {}大括号定义了数组、枚举和结构体的作用域和组语句以及初始化列表,但为什么不能定义类呢?此外,在switch语句中,它们需要包含在其主体中,以便break知道从哪里继续。

  • ,逗号分隔列表中的项,例如参数列表或数组初始化列表

  • :冒号用于标签之后,例如switch语句的case部分之后,或者用于分隔语句的各个部分,例如在第三级操作符'?'中。

    然而,;而不是:被用来分隔for语句的部分,例如for(i=0;i<5;i++) -为什么会这样?

  • ;分号终止语句(表达式和声明),除非它们以):终止,例如在test: (a==(c+b*d))或参数列表中。

请注意,}不算作终止语句,因此在函数或类声明末尾的}之后必须使用;,因为整个声明是由许多其他语句组成的语句。然而,函数或类的实现不是声明(因为函数或类必须已经被声明过);因此,它不算作一条语句,因此在结束的}

之后没有结束的;

最后一个奇怪的问题:为什么do...while后面需要; ?

关于如何使用分号的确切答案,请参见:

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

参考附录a

关于为什么在看起来多余的地方需要分号,例如

struct A {};

实际上你可以说:

struct A {} a;

所以在};之间有一个位置,你可以选择放一个标识符。因此需要更复杂的语法。

但是并不是每一个不一致都是基于一个全局有效的"逻辑"。c++继承了C语言的语法,而且这两种语言都有一种进化的语法,必须在不破坏现有代码的基础的情况下引入新的功能。

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::stringstring a; a.begin(); (a是字符串,因此可以访问string作用域内的成员)。作用域还澄清了嵌套开关和嵌套…是。

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

Semicolons terminate statements
forwhile外,所有语句都以;结尾。for循环的顶部包含表达式,而不是语句。你不能在for声明里放一个while。(调用的是什么 ?)是的。这很令人困惑。

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

对于switch语句,如果没有大括号,你怎么知道最后一个case结束了,是时候"切换后继续"了?break语句将控制转移到切换后的第一行代码。大括号是你知道它在哪里的唯一方法。