Tuseday , 1st, Mar,2022
while
for
do while
//while
循环是存在的
循环是可终止的
表达式若为非0,就是真,那么一定要执行
循环语句。有可能为一个语句块
break使用,会直接跳出循环
continue执行后,跳过本次循环,又回到while,死循环
1234_(死循环)
//使用场景1
getchar-获得字符
正确时返回的是ascii码值,如果错误返回的是eof
EOF-文件结束标志
getchar()获取一个字符放在ch里,此时这个字符如果不等于EOF(即不是结束或着是遇到错误了),那么开始循环,打印这个字符
getchar是从键盘 缓冲区 (得先有) 处读取字符的,当用户输入A,且敲入回撤(\n)确定后,
用户实际输入为两个字符,分别是A和\n
getchar先获得A,判断不是EOF,循环为真,putchar输出A
getchar然后获得\n,判断不是EOF,循环为真,putchar输出\n, 即回车,等待下次输入
所以打印的光标自动落在回车行
所以getchar不会忽略回车字符
这样的一般用于多组数组中
//使用场景2
在scanf中password是数组名本身就是个地址,
所以这里不需要用&password进行取地址操作
getchar 和scanf 同时等待去缓冲区取数
scanf会去取数123456,但不会取\n
输出“请确认密码”
此时getchar因为可以取回车符,所以会取\n, 存到ch中,
if会进入判断,此时ch==\n,而不是Y,
所以也会输出“确认失败”
优化改进1:
所以在输出“请确认密码”后应该清空缓冲区
直接用getchar()读取,不存储,只是读取即可
但是如果密码中含有空格,此方法又会失败
此时输入的在缓冲区的为:123456 abcdef\n
scanf读取123456
剩下: abcdef\n
getchar接着只能读取一个空格
进入if判断剩下的,依然失败
优化改进2:
空格以后的一直取完,用while一直取
一直取,不用语句
getchar返回的是字符对应的acsii码值,所以为int
EOF为-1,也返回int
在ascii表中,数字0-9,因为返回的是ascii码,所以直接用< >号来比较判断:
小于'0'字符的和大于'9'字符的都为非数字
因此,非数字会执行contibue而不打印
为什么循环语句有了while还需要for?
循环结构由3部分决定:初始化条件,判断部分、调整部分
由于在后续考虑到会使用大量代码插入进去,使得3部分分离太散,不方便分析和阅读
因此考虑将3个部分放在一起,就需要使用for
//for
//break 和 continue在for中
break-终止for循环
continue-后面的代码不执行,开始新一轮的循环,for中跳到调整部分,while有可能会避开调整部分
注意:
1.循环变量改在了循环体内-死循环/改变
调整部分放到下面是可以的
2.前闭后开
i<10优于i< =9,因为便于看出,刚好循环了10次
//for变种1-3个部分都省略了
判断部分的省略-判断部分恒为正-死循环
3个部分都可以省略
但省略容易出错
如:
以上没有省略的总共打印9次
省略了判断语句后,只打印了3次
i = 0 时i<3满足第一个for循环,进行第二个for循环,j自增,打印3次,此时j=3
跳出后i自增,为1,满足第一个for,进行第二个for,
由于j还是等于3不满足条件,所以不执行第二个for循环,不打印
同理,总共只打印了第一轮的3次
//for变种2-含两个变量
0次
判断部分的k=0为赋值,不是等于!!!!
把0赋值给k,k=0 为假,所以这个循环一次都没有进入