目录
注意:这些循环语句和选择语句都没有“;”!
while循环语句
基本知识点:
for语句和while语句可以等价替换, for循环要比while循环好,推荐for循环;
在C语言所有设置循环的方法中,while语句是最简单也是最基本的。
格式:while(表达式){语句,即循环体}
while循环执行过程:
(1)求解表达式;
(2)表达式为真,则执行循环体,后执行第(3)步。若表达式的值为0,则执行第(5)步。
(3) 再次判断表达式
(4)转回第(2)步继续执行
(5)(5)循环结束,继续执行while语句下面的语句。
无限循环·while(1/true)
如果表达式的值始终非零,while语句无法终止。
但是有时候,C程序员会故意用非零常量作为控制表达式来构造无限循环。
当然,也可以使用break,goto,return等语句或者调用其他函数来终止。
for循环也可以建立无限循环:for(;;)…
代码练习:
#include <stdio.h>
//while循环·显示平方表
int main(void)
{
int i = 1,n;
printf("This program prints a table of squares.\n");
printf("Enter number of entries in table: \n");
scanf("%d",&n);
while (i <= n)
{
printf("%10d%10d\n",i, i*i);
i++;
}
return 0;
}
/**
* @brief简介
*
* 留意程序是如何把输出整齐地排成两列的。
* 窍门:使用类似于%10d这样的转换说明代替%d,
* 并且利用了printf函数在指定宽度内输出右对齐的特性。
*
*
*/
This program prints a table of squares.
Enter number of entries in table:
13
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
11 121
12 144
13 169
do语句
基本知识点:
do语句本质上就是while语句。
格式:do语句 while(表达式);
do while循环执行过程:
(1)执行一次循环体
(2)执行上述while循环执行过程
代码练习:
#include <stdio.h>
//do语句·计算整数的位数
int main(void)
{
int digits = 0,n;
printf("Enter a nonnegative integer: \n");
scanf("%d",&n);
do
{
n /= 10;
digits++;
} while ( n>0 );
printf("The number has %d digit(s).\n",digits);
return 0;
}
/**
* @brief简介
* nonnegative: adj. 正的,非负的
* digits: n. 位数 / 数字
*/
Enter a nonnegative integer:
1234
The number has 4 digit(s).
for循环语句
基本知识点:
在for循环里面有一个变量i,在for循环外边也有一个变量i的时候,两个变量i不是一个,for语句声明的变量不可以在循环外访问(在循环外不可见)。
for循环的()里最多2个“;”
表达式是可以进行省略的:
完整的:for(i = 10; i >0;i--){…}
省略初值:i= 10;for(; i >0;i--){…}
省略步长:for(i= 10; i >0;){…i--}//此时需要注意,第二个1表达式的值需要设置为可以最终变为假
省略步长:for(i= 10; i >0;){…i--}
for语句的惯用法:
for( i = 0; i < n; i ++) → [0,n-1]
for( i = 0; i <= n; i ++) → [0,n-1]
for( i = n - 1; i >= 0; i --) → [n-1,0]
在C99中,可以直接在for循环里声明变量 for(int i = 0, j = 0; i < n; i++),只要变量类型一致,就可以省略。
稀奇古怪的用法:
1.虽然平时习惯三个表达式使用一个变量,但是,实际上关系不大。只要这个关系式值为真即可继续运行,可以三个关系式用三个变量
例如:for(square = 1; i <= n; odd +=2){…} //不推荐使用
2.空语句:
for( d = 2; d < n; d++)
{
if( n % d == 0) break;
}
//等同于下面这个:
for( d = 2; d < n && n % d != 0; d++)
;
//注意” ;"的位置
for循环执行过程:
for(表达式1;表达式2;表达式3)语句;
(1)先求解表达式1。
(2)求解表达式2,若其值为真(值为非0),则先执行for语句中指定的内嵌语句,后执行
第(3)步。若其值为假(值为0),则结束循环,转到第(5)步。 (3)求解表达式3。 (4)转回第(2)步继续执行 (5)循环结束,执行for语句下面的语句。
for循环中++i 和 i++ 的区别
在for循环里有一个i++,但是偶尔还能看见++i。
其实, ++i 和 i++的结果是一样的,因为for循环都是最后执行++i或者i++语句,但是性能是不同的。在有大量数据的时候推荐使用++i,在大量数据的时候++i的性能要比i++的性能好:
i++由于是在使用当前值之后再+1,所以需要一个临时的变量来转存。而++i则是在直接+1,省去了对内存的操作的环节。
代码练习:
#include <stdio.h>
#include<stdlib.h>
//for循环
int main(void)
{
int i,total;
for ( i = 1, total =0; i <= 64; i++)
{
total += i;
}
printf("%d,%d\n",total,i);
return 0;
}
/**
* @brief
* 为什么设置的是 i <= 64,最后输出的i是等于65呢?
* 无论是i++还是++i结果都是65
*
* i = 1,满足 i <= 64的条件,进行循环,执行totai += i;结束后进行i++,然后 i =2。
* …
* i = 64,满足 i <= 64的条件,进行循环,执行totai += i;结束后进行i++,然后 i =65。
* i = 65,不满足 i <= 64的条件,跳出循环。则此时i = 65.
*
*/
退出循环语句
break用来跳出循环并把程序控制传递到循环后的下一条语句,即循环完全结束。对于退出点在循环体的中间而不是循环体之前或者之后的情况,break语句特别有用。可以在任何循环语句和switch语句中使用。但是放在return 语句后面无效。
continue语句用来跳出本次循环的剩余部分,即本次循环结束,会再次开始下一轮循环。只可以在循环体中使用。
goto语句则可以跳到函数内的任何语句上。(很少使用)
格式:
goto 标识符;
…
标识符:语句
( 标识符:语句 可以放在任何位置,但必须和goto语句在同一函数内)。