3

我试图辨别 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))或参数列表中。

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

最后一个奇怪的地方:为什么 a;之后需要 a do...while

4

3 回答 3

3

For the definitive answer as to how semi-colons are used, see:

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

Refer to Appendix A.

As to why semi-colons are required where they seem to be redundant, e.g.

struct A {};

You can in fact say:

struct A {} a;

So there is a location between } and ; where you can optionally put an identifier. Hence the necessity for more complex syntax.

But not every inconsistency is justified based on a globally valid "logic". C++ inherits syntax from C, and both languages have an evolved syntax that had to introduce new capabilities without breaking large bases of existing code. They bear the scars of this evolution.

于 2011-10-19T18:20:16.163 回答
3

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, or 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包含表达式,而不是语句。你不能whilefor声明中放一个东西。(这叫什么?)是的这很令人困惑。

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
于 2011-10-19T19:02:28.620 回答
0

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

于 2011-10-19T19:06:19.390 回答