【Primer】Chapter-6 Statements

单独的分号表示一个空语句

条件语句中的条件表达式中的变量类型必须是可以转换为bool值的,比如算术类型、指针类型,对类类型取决于类本身,IO类型可以作为条件,但是vector和string一般不可以作为条件

if(int ival=get_value);//ok
if(ival=0);//ok

悬垂else的二义性:C++ 中悬垂 else 问题带来的二义性,通过将 else 匹配给最后出现的尚未匹配的 if 子句来解决.所以花括号能这里不能省

     // oops: incorrect rewrite:
     // This code won't work!
     if (minVal <= ivec[i])
          if (minVal == ivec[i])
               ++occurs;
     else {      
     // this else goes with the inner if,
     // not the outer one!
          minVal = ivec[i];
          occurs = 1;
     }

switch控制流:case 标号必须是整型常量表达式(不能是变量)

存在一个普遍的误解:以为程序只会执行匹配的 case 标号相关联的语句。实际上,程序从该点开始执行,并跨越 case 边界继续执行其他语句,直到 switch 结束或遇到 break 语句为止。不要break在某些情况下也是需要的。

变量从它的定义点开始有效,直到它所在块结束为止.所以如果switch中的case后如果不跟着使用花括号括起来构成语句块中定义变量,则只能在最后一个case标号或者default后面定义变量,以避免出现代码跳过变量的定义和初始化的情况。

while语句,以及指针的使用,动态内存分配的使用例子:

    // arr1 is an array of ints
     int *source = arr1;
     // number of elements
     size_t sz = sizeof(arr1)/sizeof(*arr1); 
     // uninitialized elements
     int *dest = new int[sz];
     int *tp=dest;
     //  copy element and increment pointers
     while (source != arr1 + sz)
         *tp++ = *source++; 
     delete [] dest;

一个编程经验:使用文件结束符来控制循环cin输入时,如果要开始第二个循环输入,要先调用cin.clear();

cout<<"enter string(ctrl+z)"<<endl;
vector<string>a,b;
string tp;
while(cin>>tp)
{
	a.push_back(tp);
}
cin.clear();
while(cin>>tp)
{
	b.push_back(tp);
}
另外一个编程简洁风格:下面的循环在 vector 中搜索某个特殊值的第一次出现。一旦找到,则退出循环
vector<int>::iterator itr=vec.begin();
while(itr!=vec.end() && val!=*itr++);
if(itr!=vec.end())
//do something

continue语句:continue 语句导致最近的循环语句的当次迭代提前结束。对于 while 和 do while 语句,继续求解循环条件。而对于 for 循环,程序流程接着求解 for 语句头中的 expression 表达式。

goto语句不能跨越变量的定义语句向前跳转:

     // ...
     goto end;
     int ix = 10; // error: goto bypasses declaration statement
 end:
     // error: code here could use ix but the goto bypassed its declaration
     ix = 42;
如果确实需要在 goto 和其跳转对应的标号之间定义变量,则定义必须放在一个块语句中:
         // ...
         goto end; // ok: jumps to a point where ix is not defined
         {
            int ix = 10;
            // ... code using ix
         }
     end: // ix no longer visible here

异常处理:没有异常处理则中断,退出程序

Try 。。。Catch。。。程序接着catch后面语句执行

抛出一个异常时,首先要搜索的是抛出异常的函数。如果没有找到匹配的 catch,则终止这个函数的执行,并在调用这个函数的函数中寻找相配的 catch。如果仍然找到相应的处理代码,该函数同样要终止,搜索调用它的函数。如此类推,继续按执行路径回退,直到找到适当类型的 catch 为止。

抛出异常即throw语句执行!

如果不存在处理该异常的 catch 子句,程序的运行就要跳转到名为 terminate 的标准库函数,该函数在 exception 头文件中定义。这个标准库函数的行为依赖于系统,通常情况下,它的执行将导致程序非正常退出。

在程序中出现的异常,如果没有经 try 块定义,则都以相同的方式来处理:毕竟,如果没有任何 try 块,也就没有捕获异常的处理代码(catch 子句)。此时,如果发生了异常,系统将自动调用 terminate 终止程序的执行。

你可能感兴趣的:(【Primer】Chapter-6 Statements)