zerglurker的C语言教程008——循环语句详解

上节课我们提到了程序语句的三大执行顺序:顺序执行、条件执行和循环执行

今天我们详细讲讲循环执行,不废话,先上代码和运行效果

首先来一段示例代码,老规矩,新建一个空项目(参考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里面用,外面则看不到

时间: 2024-10-16 05:47:27

zerglurker的C语言教程008——循环语句详解的相关文章

单片机c语言教程:C51循环语句

单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间.我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序 结构清晰明了,而且

PHP循环语句详解

循环结构 一.while循环 while(表达式) { 循环体;//反复执行,直到表达式为假 } 代码: $index = 1; while ($index<5) { print "Number is {$index} "; $index++; } print "Done"; 运行结果: Number is 1 Number is 2 Number is 3 Number is 4 Done 二.do while循环 do { 循环体;//反复执行,直到表达式

zerglurker的C语言教程010——运算符详解(二)

首先,请参考上节课我们提到的运算符总览 今天我们主要讲解下面几个运算符: ()圆括弧运算符 {}组合运算符 ::作用域解析 throw运算符 ,逗号运算符 ()圆括弧运算符 使用示例: a*(b+c) (b>=a)&&(c<=a) (a%(b/c))*d 特点说明: 1 圆括弧拥有优先执行权限.即运算表达式时,优先运算圆括弧内的表达. 2 圆括弧可以嵌套,嵌套时内部的圆括弧拥有更高的优先级. 注意: 由于()作为圆括弧运算符的时候,里面的表达式不可以为空,也不可以有多个语句,所

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

?? 上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存

python基础教程:Python中垃圾回收和del语句详解

Python语言默认采用的垃圾收集机制是引用计数法,本文详细的介绍了Python中垃圾回收和del语句详解,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧Python中的垃圾回收算法是采用引用计数, 当一个对象的引用计数为0时, Python的垃圾回收机制就会将对象回收 https://tieba.baidu.com/p/6575202861 a = "larry"b = ahttps://www.douban.com/group/topic/16

批处理命令 For循环命令详解

批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他;IN:命令的格式,照写就是了;(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下

【转】批处理命令 For循环命令详解!

批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他;IN:命令的格式,照写就是了;(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下

【转】MySQL用户管理及SQL语句详解

[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysql.user; +--------+------------+-------------------------------------------+ | user | host | password | +--------+------------+---------------------------

Nmap扫描教程之基础扫描详解

Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在实施这些扫描工作之前,需要先简单了解下Nmap工具的使用,以方便后面实施扫描.所以,本章将通过使用Nmap工具实施基础的扫描,来帮助用户了解该工具. Nmap扫描扫描概述 在实施基本的扫描之前,需要先了解一些Nmap网络扫描的基本知识,及需要考虑的一些法律边界问题.本节将对网络基本扫描进行一个简单介