语句的作用域是以{}界定的。包括类作用域、函数作用域那、块作用域等。for 和while和switch里面定义的变量的作用域都只是这个语句。
if else语句的匹配规则是,C++标准规定:else与离它最近的尚未匹配的if匹配。
if语句的条件判断表达式是可以定义变量的,这个变量的作用域是这条if语句。例如下面的程序是合法的:

int main() {
       if(int a=1){
           cout<<" a is "<<a<<std::endl;
       }
    return 0;
}

switch语句的case标签必须是整形常量表达式,就是说这个必须是一个常量,而且可以转换成整数。
应该避免在case语句内初始化变量,因为一旦某个case语句存在初始化,那么它就不能被跳过。这里要注意赋值和初始化的区别,赋值调用的是operator=函数,初始化调用的是构造函数。
在定义的时候赋值就是初始化。
在switch语句当中,如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处是非法的。

传统的for语句分为初始化、条件、迭代表达式、循环体四个部分。当条件语句是空的时候,相当于写上量true.除了循环体之外,剩下的地方都不能使用复合语句。迭代表达式必须是一个表达式或者为空。循环每执行一次,循环体内定义的变量都会经历一次构造到销毁的过程。

范围for语句本质上是通过迭代器和传统for语句来实现的,因此拥有begin()和end()成员函数的类型才能使用范围for.因为与迭代器相关,因此在范围for里面增加或删除容器的元素可能会导致迭代器失效,从而产生为定义行为。例如end()迭代器的值被改变量,但是因为循环里的end值已经在循环第一次运行的时候初始化量,那么就可能进入死循环。所以应该避免在范围for里面做可能让迭代器失效的行为。

break语句的作用只限于最近的循环或者switch.

goto语句的作用是从goto语句无条件跳转到同一函数体内的另一个语句。
与switch类似,跳转的过程中不能跳过变量的初始化。跳回变量的定义之前意味着变量会被销毁之后再创建一次。
向后跳过一条已经执行的定义是合法的。

try-catch语句抛出异常之后寻找处理代码的过程与函数的调用链是相反的,如果最终找不到,那C++运行时会调用terminate()的标准库函数,函数行为与系统有关,一般会造成程序的非正常退出。
标准库定义了一些异常,通过异常的what()成员函数可以获得一些相关的文本信息。
相关的头文件包括: <type_info>