结构 - 结构化编程
大约 4 分钟
结构 - 结构化编程
结构化编程思想(逻辑控制)
语句块
- 作用:允许把多条语句放到按C++句法只能放一条语句的地方(逗号运算符同样可以做到相同的工作)
- 使用:两个花括号能构造一条复合语句(代码块)
- 局部变量:语句块中可定义局部变量,执行完语句块后变量将被释放
循环
for [- else](与C不同)
使用
- 通式:
for (initialization; test-expression; update-expression) body
- 举例:
for (i=0; i<5; i++) a++
(单行执行语句可以不加大括号)
- 通式:
组成
- 初始化(loop initialization)
- 循环初始化(initialization)
- 循环测试(test-expression)
- 更新表达式(update-expression)
- 循环体(loop body)
- 初始化(loop initialization)
执行顺序
- 初始值 > 执行测试 > 执行循环体 > 更新用于测试的值 > 从2开始重复
声明语句表达式、新的for语句
声明语句表达式(旧)
- C++曾定义了声明语句表达式,允许在for初始化处声明变量(语法糖,本质还是for前声明变量)
- 而本来在for中只能初始化值,需要提前声明变量
- 声明语句表达式只能在for中使用,在其他地方声明语句不被视作表达式
- 这种修改后来被取消,取而代之使用新的for语句
新的for语句(新)
将for语句从
for(expression, expression, expression) expression
改为
for(for-init-statement condition; expression) expression
(初始化和条件都在前面,一并视作语句)与在for前声明相比,这种变量之存在for语句中,当程序离开循环后变量将消失(一些老式编译器仍视作在循环前声明)
while [- else]
- 使用:
- 通式:
while (test-condition) body
- 通式:
- 执行顺序:
- 执行测试 > 执行循环体 > 从头开始重复
do-while [- else]
- 区别
- for循环和while:入口条件(entry-condition)循环(每轮循环之前都计算测试表达式的值)
- do-whild:出口条件(exit condition)循环
- 使用
- 通式:
do body while (test-expression)
- 通式:
三种foreach高级循环
基于范围的for循环(引用循环和值循环)
常用于数组遍历
一般是通过str.size()
限制范围,用中括号法取元素
但C++11新增了一种循环:基于范围
(range-based)的for循环,可用于数组和容器类(如vector和array)
- 使用
- 例如
for (double x : prices) cout << x << std::endl;
(只能输出) - 例如
for (double &x : prices) x = x*0.8;
(可以改变数组的内容)
- 例如
_
引用和值的循环
for (double x : prices) cout << x << std::endl; // 只能输出
for (double &x : prices) x = x*0.8; // 可以改变数组的内容
QT的foreach
Qt提供的替代C++中for循环的关键字
foreach(int, QList<int>)
{
// process
}
STL容器循环
for (auto it = my_array.begin(); it != my_array.end(); ++it)
{
*it *= 2;
cout << *it << endl;
}
延时循环
方案一:
clock()
,返回程序开始执行后所用的系统时间但返回单位不一定是秒,而且返回的类型不确定
方案二:头文件
ctime
定义了常量CLOCKS_PER_SEC
,等于每秒种包含的系统时间单位数,即系统时间/CLOCKS_PER_SEC==秒数
而且
ctime
将cloct_t
作为clock()
返回类型的别名
条件
if [- else if - else]
使用:
if (test-condition) statement1 else statement2
,或if - else if - else
自由排列:
if - else if - else
的写法基于C++的自由排列规则if (test-condition1) statement1 else if (test-condition2) statement2 else statement3 // 可被排列成: if (test-condition1) statement1 else if (test-condition2) statement2 else statement3
switch
使用:
switch (interger-expression) { case label1 : statement(s) case label2 : statement(s) // ... default : statement(s) }
技巧——枚举量用作标签
enum {red, orange, yellow, green, blue, violet, indigo} switch (颜色号): case red : // ... // ...
与if语句区别
- 需要
break
:case是行标签而不是选项之间的界限,程序不会在执行到下一个case处自动停止,必须使用break
语句跳出 - 比较局限性:不能处理取值范围、浮点测试,只能进行整数测试
- 性能:快很多
- 需要
三目运算符(条件运算符)
- 使用:
expression1 ? expression2 : expression3
- 与if语句区别:三目运算符生成一个表达式,是一个值
跳转
break和continue语句
break
:用于循环体和switch(还能跳出switch语句)- 循环体使用:跳出全部循环,即跳过循环的剩余部分并到达下一条语句
- switch使用:跳出switch语句(默认执行完case后的语句不会停止)
continue
:用于循环体(不能用于switch语句)- 循环体使用:跳出本次循环,即跳过循环体剩余部分并开始新一轮循环