c++标点符使用的逻辑是什么?
What is the logic of C++ punctuator usage?
我试图辨别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::string
或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
循环的顶部包含表达式,而不是语句。你不能在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
语句将控制转移到切换后的第一行代码。大括号是你知道它在哪里的唯一方法。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么