C++语句中大多数的语句以分号结束。(一不小心就会漏掉分号)
如果在程序的某个地方,语法上需要一条语句,但是逻辑上不需要,此时应该使用空语句
//重复读入数据直至文件末尾或某次输入的值等于sougth(这样写有点看不惯)
while (std::cin >> s && s != "sougth")
;
//还是这种格式
while (std::cin >> s && s != "sougth")
{}
//还是说是这种格式
while (std::cin >> s && s != "sougth")
{
;
}
指用花括号括起来的(可能为空)语句和声明序列(这样就相当于把多条语句当成一条语句来处理)。
补充说明:
复合语句也被称为块,一个块就是一个作用域。
在复合语句内部定义的变量,仅在相应语句的内部能够可见,一旦语句结束,变量也就超出其作用范围了。
字面意思,在一定条件下才会执行的语句。
一种是if语句,一种是switch
if语句有那些形式?
if和if…else
if(condition)
statement
if(condition)
{
statement
}
else
{
statement
}
补充说明:
C++中它规定else与离他最近的尚未匹配的if匹配。
//这是人为写成这样的,看起来第一个if和else缩进一致,应该是一组
if (grade % 10 >= 3)
if (grade % 10 > 7)
lettergrade += '+';
else
lettergrade += '-';
//这是vscode 格式化工具,格式化后第二个if和else才是真的一对。
if (grade % 10 >= 3)
if (grade % 10 > 7)
lettergrade += '+';
else
lettergrade += '-';
//关于“{”加在什么地方,这是两大派系。
//if...else嵌套的时候,尽量加上"{}"。如果if后面跟了"{}",那么else后也跟"{}"(个人习惯,感觉这样好看些)
if (grade % 10 >= 3)
{
if (grade % 10 > 7)
{
lettergrade += '+';
}
}
else
{
lettergrade += '-';
}
格式
switch(expr)//expr 能够转换成整数
{
case标签1://case 1: case关键字和其对应的值一起被称为case标签
statement
break;//执行case标签1下的内容后就退出,若不加会继续执行case标签2下的内容
case标签2:
statement
break;
case标签n:
statement
break;
default:
statement
break;
}
补充说明:
switch后面紧跟的表达式必须是能够转换成整数。
case关键字对应的值必须是整型常量表达式。
case关键字对应的值不能够重复。
形式:
while(condition)
staement
for(init-statement; condition; expression)
statement
补充说明:
init-statement 可以同时定义多个对象,但是这些对象的在同一条声明语句中。
for语句头能省略(写成空语句)init-statement/condition/expression中的任意一个(或者是全部)。
C++11引入了一种更简单的for语句,这种语句能够遍历容器或其他序列的所有元素。
for(declaration:expression)
statement
declaration中定义的那个变量。
expression 必须是一个序列。(拥有能返回迭代器的begin和end成员)
补充说明:
在declaration定义变量的时候:确保序列中的每个元素都能转换成该变量的类型(最简单的是直接用auto)
如果需要对序列中的元素进行写操作,那么范围变量必须是引用。
形式:
do
statement
while (condition);
do while 和while的区别?
do while会先执行一次循环体,然后再判断循环条件。 而while是先判断循环条件,然后再执行循环体。
//自己写了一段体会一下
std::vector vec = {0, 1, 2, 3};
for (auto ri : vec)
{
std::cout << "ri = " << ri << std::endl;
int i = ri;
do
{
i++;
std::cout << "do while i = " << i << std::endl;
} while (i < 2);
i = ri;
while (i < 2)
{
i++;
std::cout << "while i = " << i << std::endl;
}
std::cout << std::endl;
}
do while 至少执行一次,while可能一次都不执行。
do while 若第一次条件为真,那么执行次数和while相同。
C++提供了四种跳转语句:break,continue,goto和return(return在函数相关章节介绍)
负责中止离他最近的while,do while,for或switch语句,并从这些语句之后的第一条语句开始执行。
终止最近的循环中的当前迭代并立即开始下一次迭代。
从goto语句无条件跳转到同一个函数内的另一条语句。(除了练习以外,在工作中从未使用过)
形式:
goto label;
label是用于标记语句的标识
label格式:
label:statement
补充说明:
label可以和程序中的其他实体标识符使用同一个名字。
当程序出现异常后,不至于直接挂掉。
抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。
使用throw表达式
格式:
throw expression;
try语句块一开始是关键字try,后面紧跟着一个块,跟在try块之后的是一个或多个catch子句。
catch 可以有多个,但至少要有一个。
格式:
try
{
program-statements
}
catch(exception-declaration)
{
handler-statements
}// ...
当选中了某个catch子句处理异常之后,执行与之对应的块。catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行。
有,使用catch(…)
C++中定义了一组类,用于报告标准库函数遇到的问题。分别在四个头文件中。
exception头文件定义了最通用的异常类exception,只报告异常的发生,不提供任何信息。
stdexcept头文件定义了集中常用的异常类
new头文件中定义了bad_alloc异常类型。
type_info中定义了bad_cast异常类型。
try…catch 语句的执行过程是:
void throwString()
{
try
{
throw std::string("try catch test,throw string.");
}
catch (std::string str)
{
std::cout << str << std::endl;
}
}
void throwInt()
{
try
{
throw 111;
}
catch (int i)
{
std::cout << " catch int " << i << std::endl;
}
}
void throwChar()
{
try
{
throw 'c';
}
catch (char ch)
{
std::cout << "catch char " << ch << std::endl;
}
}
void throwFloat()
{
try
{
throw 3.14f;
}
catch (float fl)
{
std::cout << "catch float " << fl << std::endl;
}
}
void throwDouble()
{
try
{
throw 3.15;
}
catch (double dou)
{
std::cout << "catch double " << dou << std::endl;
}
}
void throwCatchAny()
{
try
{
throw "catch any...";
}
catch (...)
{
std::cout << "can not get str" << std::endl;
}
}
void stdTryCatch()
{
try
{
std::vector vi = {1, 2, 3, 4, 5};
std::cout << vi.at(100) << std::endl;
}
catch (const std::exception &e)
{
std::cout << "std::exception e.what() = " << e.what() << '\n';
}
}
int main(int argc, char **argv)
{
throwString();
throwChar();
throwDouble();
throwFloat();
throwInt();
throwCatchAny();
stdTryCatch();
return 0;
}
执行结果:
try catch test,throw string.
catch char c
catch double 3.15
catch float 3.14
catch int 111
can not get str
std::exception e.what() = vector::_M_range_check: __n (which is 100) >= this->size() (which is 5)