条件判断对于我们来说,已经是非常信手拈来的事情了,这里我总结一些小小的细节,让我们更好的更深度的理解条件判断。
循环语法的深入理解
三种循环结构理解
三种循环: while do while for
首先我们了解一下循环的三要素:1、循环条件初始化 2、循环判定 3、 循环条件的更新
我们先来看看while循环 这张图标示了循环的要素和循环的执行顺序。 基本是一个顺序的结构,while()if()其实他们两个判定逻辑是一样的,先计算得到逻辑,再去判断逻辑,最后执行。只不过while一遍后会回到二处再次判定。
for循环 for(int i= 0;i <10 ;i++) 最大的优点是语法结构紧凑,你不用担心程序太大,导致少了循环条件更新等小操作,从而导致程序bug难寻。
do while循环 程序一定会进入一次,怎么验证呢?我们把while后的判断赋成假,发现循环体还会执行一次才退出。 再很多游戏场景中我们会用到它。 我们推荐这样的写法,while写到花括号后面,并且是有 分号 的哦,不要忘记了。
死循环写法
while(1) { } 这里不需要多解释了,当然括号里只要是非零都可以,但是1会规范点,你如果写个8,看代码的人可能会突然愣一下。
for( ; ;) for这样用也是可以的,以前我都没怎么用过,以后要多试试
do{ }while(1) 这里和while一样了
getchar函数和相关深剖
我们首先知道,在c语言程序运行时,编译器会自动帮我们打开三个文件: 标准输入 stdin FILE* stdin (键盘) 标准输出 stdout FILE* stdout (显示器) 标准输入 stderr FILE* stderr (显示器) 他们叫标准输入输出流
他们是一种文件指针类型的文件,我们也知道 FILE * open这个函数是用来打开文件的,上面三个函数和open是相同的类型。 为什么要用FILE * 这样的类型定义他们呢? 这是因为这样就可以用操作文件的方法,操作一切。可以控制键盘显示器硬盘等等。
我们使用C语言的时候为什么没有打开过文件呢? 我们都是直接printf(); scanf();这样直接用。 而且为什么内容会被打印到显示器上呢? 这就是因为编译器自动打开了上面三个标准输入输出流。
因为我们程序员要调试代码,要组织代码,都需要输入输出等直观可视化的内容。不然如果不打开这三个文件,我们怎么输入,怎么看输出。还得我们自己打开,编译器一看,这活它干了。
我们回到我们getchar这个函数上,它的功能是从键盘上获取字符。 这里可没有那么简单,我们可以看到这个getchar字符的返回值怎么是int ,按照我们的常规思维,不应该返回char吗?
我们知道char的范围是 [ 0 ,255] ,其中他们的每一位都在ascll表中有对应的意义。那如果我们 char getchar()失败应该返回什么呢? 一共8个比特位, 从 0000 0000 -> 1111 1111 哪一个都不能代表失败的意思,这256个字符都有其各自的意思。那1 0000 0000它呢?这不是被截断了吗又是0. 所以我们无法表示错误。 这就用了int 来返回了。
第二点:
我们还需要知道的一点是,当我们getchar一个字符,如果我们用回车结束,那getchar会多打印一行回车,getchar本来带一位回车。这样会打印两行回车,再去输出你输入的字符。所以一般getchar时 我们不用回车,空格就好了。
第三个关键点是: 我们从键盘上输入的所有内容 ,显示器上打印的所有内容全部都是字符 !!!
我们经常写的代码 printf ( “ %d” ,1234); 这个时候显示在显示器上的,其实都是字符,并不是数字 那我凭什么这么说? 我们拿一下printf的返回值,在打印这个返回值我们可以得到如下结果。 很明显时5个字符。 不仅仅printf打印出的是字符,我们从键盘输入到显示器的也是字符。不过是通过scanf的格式控制,转换了格式,把字符转换成你需要的格式并放在变量空间中。
所以我们可以更深刻的理解什么是格式化输入输出。 printf和scanf ,它们格式的是什么? 其实就是把字符格式化成对应的格式。 所以,linux中说一切皆文件,所以,我们把键盘和显示器,叫做字符设备
goto-真的很有用
void 的理解
void修饰函数和函数参数的作用
void指针的用途
|