C++ Primer学习 《语句-Statements》

语句-Statements

switch语句

关于case的值

case关键词和对应的值,这两者一起被称作case标签(case label)。这个值必须是constant int

int sa = 0;
switch (..)
{
case sa://error!sa不是constant
	break;
}

case内的变量初始化

switch语法有一个比较麻烦的地方,就是任一case内不能有变量初始化语句,除非用{}将该变量初始化语句包起来。

具体的:

//在各个case间,如果没有{}将case内容包起来,那么写在下面的case语句的范围(scope)包括了上面的case语句!因此,如果在上面的case语句对某个变量做初始化,那么程序有可能跳过这个初始化,而下面的case语句如果对该变量直接调用,就会发生意外情况!因此,这个语法是被禁止的!
case 1:
    string f;//error!控制语句会跳过这个隐式初始化语句
    int ival = 0;//error!控制语句会跳过这个显式初始化语句
    int jval;//ok!只声明,没有初始化
    break;
case 2:
    jval = 1;//ok!jval在范围内(in-scope)
    cout<<f<<endl;//error!如果上面的f可以被初始化,这里就能直接输出f,而控制语句事实上会跳过前面的初始化过程,到这这里的输出发生错误!
    break;
而如果我们一定要做初始化,那么需要用到{}

case 1:
{
    string f = "f";//ok!
}
break;
case 2:
    cout<<f<<endl;//error! f不在范围内(not in-scope)


Range For

这是C++新的特性,非常非常好用!

基本语法

for(declaration : expression)
    statement

这里expression必须是一个序列,例如一个braced initializer list(例如: {1, 2, 3, 4}),一个数组,一个vector或string这样的具有返回begin和end这样的迭代器(iterator)成员的object。

而declaration定义了一个变量(注意,和traditional for不同,这里必须是定义一个新的变量!),expression序列中的每一个元素都必须能转换成declaration的变量。

最简单的方法是用auto来定义这个变量~

如果我们在range for中需要同时修改expression序列中的值,那应该把变量定义为reference!

Range For中不应该添加或删除元素

在range for中有一个禁忌,就是对expression中的序列不应该增加或删除元素!这是因为,range for通过该序列的begin和end这两个地址,来遍历序列,如果意外增加和删除序列,会改变end的位置!VS2013中,这个错误在编译时不会提示,但在运行时会立刻报错(debug模式下)。

在String中的应用(其他类中使用方法完全类似)

string str("some string");
for(auto c: str)
      cout<<c<<endl;

改变内容

如果想通过ranged-based for改变expression的内容,我们需要将declaration声明成reference
例如:

for(auto &c : s)
      c = toupper(c);


do-while 语句

在do-while中有一点需注意,那就是while后的括号内不能有变量声明或初始化。

do{
...
}
while(int a);//error!


Goto 语句

C++强烈不推荐使用goto语句,事实上很少很少需要用到它。

语法

goto label;
//label是用:标示的,如:
end : return;
label的标示名与变量名是不冲突的。然而,这个标示名属于预编译(precompile)的,和头文件中我们常常定义的#ifndef...#define...是一样的,它们之间不能重名。

注意的是,label标示和goto语句必须在同一个函数内!


你可能感兴趣的:(C++,语句)