单独的分号表示一个空语句
条件语句中的条件表达式中的变量类型必须是可以转换为bool值的,比如算术类型、指针类型,对类类型取决于类本身,IO类型可以作为条件,但是vector和string一般不可以作为条件
if(int ival=get_value);//okif(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 intsint *source = arr1;// number of elements
size_t sz = sizeof(arr1)/sizeof(*arr1);// uninitialized elementsint *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 statementend:
// error: code here could use ix but the goto bypassed its declarationix = 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 终止程序的执行。