C语言学习笔记4
一、综述
今天真正的系统性的学完了循环,包括for、while、do...while,以及相关的语句比如break、continue、goto,还学习了随机数相关的关键词,接下来是详细的讲解。
二、循环
1、循环语句
纠正一下之前的错误,循环语句是for、while、do...while,switch并不是循环函数
for循环是C语言中最常用的循环,主体结构为for(表达式1;表达式2;表达式3)
其中表达式1用于初始化变量,表达式2用来描述表达式,表达式3则用于操作函数,使其发生变化。
#include<stdio.h> int main() { int a = 0; // 初始化a;a<10则继续循环;a自增1 for(a = 0 ; a < 10 ; a++) { printf("%d\n" , a ); } return 0 ; }这段代码会一直循环打印a,代码的输出结果为
1
2
3
4
5
6
7
8
9
因为for循环的判断逻辑为a++以后判断a<10,所以a=9再加一后变为a=10,所以跳过后面的打印语句,最终结果就是10无法打印,所以for循环的执行次数为n-1.
while语句和for语句的区别在于while语句的初始化和自增位置不同。
#include<stdio.h> int main() { int a = 0 ; while(a<10) { a++; printf("%d\n" , a); } return 0 ; }这段代码也是循环打印1-10,结果为:
1
2
3
4
5
6
7
8
9
10
因为while语句的判断条件是开始的时候判断,所以a=9的时候并没有超过10还会运行一次,然后a++再打印,所以就可以打印出10,所以while语句的循环次数为n,while语句和for语句比起来最大的问题在于for将变量的初始化及操作变量集成在开头,而while本身只有表达式,这可能导致while循环容易出现死循环,例如忘记给变量增加变化,就会导致变量一直不变从而造成死循环。
do...while语句是while语句的一种变种写法为
#include<stdio.h> int main() { int a = 0; do { a++; printf("%d\n", a); } while (a < 10); return 0; }打印结果与上面的while循环的结果一致,但是有一点需要注意,while语句是先判断再开始循环,所以可能完全不循环,do...while会先执行一次代码再进行判断。
2、循环关键词
循环中常用的关键词为continue、break、goto
continue用于重新开始新一轮循环,break用于跳出循环,goto则是跳转至某个特定的位置
#include<stdio.h> int main() { int a = 0; this: while (a < 10) { a++; if (4 == a) { continue; } if (7 == a) { break; } printf("%d ", a); } if (a<10) { goto this; } return 0; }遮断代码的运行结果为1 2 3 5 6 8 9 10
因为a == 4的时候使用了continue语句跳过了后面的代码,重新开始,所以没有打印4,7 == a的时候直接跳出了循环,所以没有打印7,又因为使用了goto,跳转到了this的位置,所以重新开始了一遍循环,但是a没有初始化,所以a是从7开始循环,然后a++后a=8就不再触发continue、break、goto,所以代码运行结束。
三、随机数
C语言中的随机数关键词是rand,取值范围为0~32767,rand是一个伪随机数
直接用rand输出的话最多5次为一个循环,循环会是以下的数字循环
41 18467 6334 26500 19169
因为rand默认种子是1,所以如果没有对种子进行初始化,就会无法生成真随机数,这时可以使用时间戳来对rand进行随机化
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand((unsigned)time(NULL)); for (int i = 0; i < 5; i++) { printf("%d ", rand()); } return 0; }这段代码就是利用时间戳对rand的种子进行随机取值,srand表示设置随机数种子,time表示时间戳,NULL则表示不用时间戳的数据,这样time(NULL)的数字就会赋给srand,又因为srand需要int 类型的数据,但是time生成的是无符号的数据,所以使用unsigned强制将time赋给srand。
