上节课我们提到了程序语句的三大执行顺序:顺序执行、条件执行和循环执行
今天我们详细讲讲循环执行,不废话,先上代码和运行效果
首先来一段示例代码,老规矩,新建一个空项目(参考006课)
新建一个空的main.cpp和public.h
public.h里面定义代码如下:
void LargeDistributionSequence(unsigned int nLength);
main.cpp代码如下:
#include <stdio.h> #include "public.h" int main(int nArgc, char* Argv[], char* Env[]) { LargeDistributionSequence(15); return 0; } void LargeDistributionSequence(unsigned int nLength) { unsigned i; for (i = 0; i < nLength;i++) { if (i != 0 && ((i % 10) == 0)){ printf("\n"); } printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2); } printf("\n"); }
Ctrl+F5后的效果如下:
for语句的使用格式是这样的:
for(初始化语句;条件语句;每次循环的变化条件处理) 需要循环的单条语句;
for(初始化语句;条件语句;每次循环的变化条件处理){
需要循环的多条语句;
}
for循环几个需要注意的地方:
1 初始化语句可以不写,也可以写多个
比如
for(;i<nLength;)
或者
for(i=0,j=0;i<nLength;i++,j++)
注意,多条初始化语句写在一起的时候,必须是能用逗号连接的表达式
表达式而非语句
2 每次循环的变化条件处理同样可以不写或者写多个,写入规则同上面
示例见1
3 条件语句必须要写,并且在每次循环开始就会进行判断
对于第一次循环,初始化语句执行完成后,就会立刻进行条件判断
如果判断失败,则后面的语句不会被执行
4 建议各位哪怕 需要循环的语句只有一条,也可以按照多条的方式,使用大括号括起来
这样不会因为你对语句进行删减而导致整个逻辑变化极大
比如:
for(i=0;i<nLength;i++) printf("ok\n"); if(i==nLength)printf("no\n");
如果需求发生变更,不仔细,将第二行语句注释掉了,那整个逻辑就会变成重复判断i是否等于nLength,然后什么也不会输出
// 注释一行,从该符号开始,后面的字符全部被注释,编译器不会理会
/* 注释内容 */ 注释一个块 从/*后面,到*/前面,这之间所有的内容都会被认为是注释,编译器不会理会
我们往往用注释暂时去掉一些不用功能,或者添加一些代码说明
除了for可以实现循环外,我们还可以用while实现循环
在public.h添加代码后如下:
void LargeDistributionSequence(unsigned int nLength); void LargeDistributionSequenceWhile(unsigned int nLength); void LargeDistributionSequenceDoWhile(unsigned int nLength);
在main.cpp添加代码如下:
#include <stdio.h> #include "public.h" int main(int nArgc, char* Argv[], char* Env[]) { LargeDistributionSequence(15); LargeDistributionSequenceWhile(15); LargeDistributionSequenceDoWhile(15); return 0; } void LargeDistributionSequence(unsigned int nLength) { unsigned i; for (i = 0; i < nLength;i++) { if (i != 0 && ((i % 10) == 0)){ printf("\n"); } printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2); } printf("\n"); } void LargeDistributionSequenceWhile(unsigned int nLength) { unsigned i=0; while (i<nLength) { if (i != 0 && ((i % 10) == 0)){ printf("\n"); } printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2); i++; } printf("\n"); } void LargeDistributionSequenceDoWhile(unsigned int nLength) { unsigned i = 0; do { if (i != 0 && ((i % 10) == 0)){ printf("\n"); } printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2); i++; } while (i < nLength); printf("\n"); }
运行后结果如下:
可以看到,三个方式结果完全一样
while的使用方式如下:
while(条件) 单个语句;
while(条件){
多条语句;
}
do 单个语句;while(条件);
do{
多条语句;
}while(条件);
类似for的注意3,while我也同样建议各位尽可能使用大括号将代码括起来
大括号的另外一个好处是,即使扩内一条语句也没有,也不会导致循环逻辑影响循环外的逻辑,这种防范在成百上千行的代码中,可以挽救你的小命
否则那些莫名其妙的程序错误,甚至让你无从下手,感觉世界崩溃。
for当初设计用来进行条件明确的循环,即初始条件明确、循环终止条件明确,以及变量明确的循环
而while则用来进行模糊循环。比如我不知道初始条件或只知道部分初始条件。变量也不明确,它可能会变,也可能下次循环才会变,或者因为用户的特定输入才会变化
但是实际使用的时候,两者可以相互替换。
比如初始条件不明朗的时候,for中的初始化语句我可以空出来不写,只写条件语句。如果变量变化也不明确,我可以不写每次循环的变化条件处理
同样,对于while 我可以在while外部将初始化语句写好,在while内部进行变量变化处理
不过对于while 和do…while还是有一个明确不一样的地方:
即do…while一定会先执行一次循环体,不管条件是否成立。而while当条件不成立的时候,可能一次都不执行
所以上面的测试代码,将main中的所有15改为0,则输出就会变成下面的样子:
第三次的时候,输出了一个0
printf可以进行格式输出,比如上面看到的一句:printf("% 4d ", ((i + 1)*(i + 1)&(~1)) / 2);
%表示后面的是格式信息,空格表示填充符号是空格,4表示对齐长度,d表示输出的是整数
整个含义是以4字符对齐输出整数,不足的地方填充空格
这样输出的数字就美观多了
不过数字一旦超过4字符长度,就会原样输出,破坏格式
关于输出格式,后面我还会详细介绍的
另外,在c语言中,for初始化语句是不能声明变量的
即变量一定要先声明,后使用
而在c++中,for初始化语句则可以声明变量,但不同编译器的版本处理又不同
vc6中for初始化语句声明的变量,作用范围和for一样大。即for初始化声明的变量,可以在for同级的代码中使用
而支持c99以及更高版本的编译器,则不允许这种情况,for里面声明的变量只能在for里面用,外面则看不到