8、循环(loops)
(1)for loops
for循环非常灵活,可以做很多事情。上图红框框出来的代码块就是一个for循环。
for是关键字
for后面内容分为三部分,每部分用分号;隔开
第一部分A是变量的声明,所以这里要声明变量,我们一般写int i=0;
变量名叫做i是一种惯例,可能是iterate的首字母。当然你也可以取你自己喜欢的名字。当然这个变量也不一定必须是int类型的,也不一定非得从0开始。
第二部分B是条件。如果条件为真,就执行for循环内部代码。这里i<5表示只要变量i小于5就满足循环条件。
第三部分C,i++会在for循环的下一次迭代之前被调用。所以我们也可以写i+=1或者写i=i+1。意思都是每迭代一次,变量i都要加1
D是循环体,就是每循环一次都要被执行的代码。
E是循环结束的标志。
再总结一遍:
当指令指针指到第7行时,首先要做的是声明一个新变量i;接下来看这个变量是否满足条件;
如果条件B返回值为true,就跳到第9行(for循环体D),执行for循环体。当for循环体执行完毕后,指令指针就走到for循环的尾部花括号E处,看到E,指令指针就再跳转到C处执行C,就是给变量i加1;加完后指令指针再跳到B,看变量是否满足条件。
如果条件B返回值为true,就跳到第9行(for循环体D),执行for循环体。当for循环体执行完毕后,指令指针就走到for循环的尾部花括号E处,看到E,指令指针就再 跳转到C处执行C,就是给变量i加1;加完后指令指针再跳到B,看变量是否满足条件。
如此循环,直到B不满足条件,也就是B返回false,指令指针跳出for循环,也就是执行E后面的代码行(第12行)。
说明:
for循环的三部分:
第一部分(int i =0;)只是在开始时运行一次。
第二部分(i<5;)是一个比较后的bool类型。
第三部分(i++;)是要在for循环结束(})后被运行的。
所以,for循环我们也可以这样写:
所以,只要你不改变执行逻辑,你在代码形式上可以行云流水,你还可以在循环体内调用函数等等,无限可能。
(2)while loops
其实while循环和for循环一模一样!
首先,while循环同样要声明变量i,只是上例中的i已经存在了,并且i已经等于5了。
其次,while循环同样需要条件,上例的条件是i>0,满足条件就跳到循环体执行循环体的代码。
最后,循环体代码执行完毕后,同样是要执行变量的自增或者自减,这里是自减i--;否则就是无限循环了。
既然while循环和for循环一样,那为什么既生亮何生瑜?
我们约定成俗是这样使用的:当我们确实是想无限持续循环的,比如游戏,就是想让一帧帧一直循环,我们不在意究竟循环了多少次,循环到哪里,就是不介意是否要去声明i,也不介意i究竟是多少了,就是想无限循环下去,那我们就使用while循环。但是当我们想循环一个确定长度的数组,而且想追踪每个元素的信息,此时我们非常在意i究竟是多少了,此时用for循环。
在举个例子:
(3)do while
循环就是这3种写法。至于汇编及CPU指令上的循环,就非常复杂了,以后有机会再探讨。
9、控制流语句:continue、break、return
continue只能在循环中使用,表示进入这个循环的下一个迭代iteration。当然前提是有下一个迭代,如果没有就结束。
break是主要用于循环中,也可以用在switch语句中。break表示跳出其所在的循环,也就是终止它所在的那层循环。
return表示跳出函数。如果一个函数中,碰到return关键字,你就会退出这个函数。但是函数是要有一个返回值的,如果你只是return,那就相当于函数只返回了return本身,而return本身就相当于void,所以return本身只适用于void函数。
(1)continue
下面我们断点的方式看看程序是如何执行的:
小结:
a、对于for语句,第一执行for语句时,是先初始化i,然后判断条件。如果条件是true,就执行循环体,一直执行到for循环的最后的花括号},跳回到for语句,此时首先执行的是i++,然后再判断条件,条件true就是上面的一套流程;如果条件false就直接跳出循环体。
b、如果在循环体中遇到continue,就直接跳回for语句。那跳回for语句,就要执行for语句,那就是先执行i++,再判断条件,再根据条件,true就执行循环体,false就跳出循环。
(2)break
(3)return
但是return是可以用在函数的任何地方的,不限于循环中。
小结:
在C++语言中,这些if语句或其他条件语句、循环语句、控制流语句就是编程的基本逻辑。我们就是使用这些工具来控制程序的流程。这些也是编写应用程序的基本构建块。
10、指针
这里我们先讨论原始的指针raw point,不是智能指针smart point。
计算机处理的是内存。对计算机来说,内存就是一切。所以编程中最重要的事情就也是内存memory!当你编写一个应用程序并启动它时,所有程序都被载入到内存,所有的指令都是告诉cpu,你的代码是要做什么的。你的程序加载到内存也就是,cpu可以访问你的程序并开始执行程序中的指令。而指针就是管理和操作内存的。
(1)什么是指针?
指针就是一个整数,但是这个整数是内存地址的数字。所以指针就是一个地址。
这就好比,一个变量int a = 5;表示这个变量存储在某个内存单元中,存储的值是数字5。而一个指针 int *a = 5;表示这个指针a也是存储在内存的某个内存单元中,但这个内存单元中存的不是数字5,而是另一个内存单元的数字序号,这另一个内存单元里面存的是一个数字5。
说明:由于本部分内容是参考【16】C++指针_哔哩哔哩_bilibili 国外和我们还是有些不一样的,至少在某些名称的翻译上不会太一致。所以看不懂的同学先回看我的【C语言学习笔记】四、指针_通过变量名访问内存单元中的数据缺点-CSDN博客 这篇文章,这篇文章把指针说得非常明白了。然后你再回头看cherno的视频,你就理解了。
小结:
定义指针变量的时候就是:
先写这个指针指向的地址中存的数据的类型,当然你还没想好这个指针变量指向谁,那你就写个void类型指针吧。
然后再写*\号,星号就是普通变量和指针变量的区别。
然后再写指针变量的名称。
这样我们就定义了一个指针变量。
说明:我们是不需要定义指针变量自身的类型的!指针变量有的编译器指定是4个字节,有的是8个字节,anyway,都不重要。就是指针变量自身的数据类型是不用管的,是不重要的。因为指针就是存地址的,所以它的存放空间的大小不会变来变去。
当我们定义了一个指针变量后,这个指针变量还没有初始化,就是这个变量还没有赋值,此时这个变量的值是内存中这个地址上的原来的值,所以此时这个指针变量是一个野指针,你千万不能解引用重新赋值,你可能就修改了不该修改的地方,系统就崩溃了。
所以当我们定义一个指针变量时,一定要同时初始化赋值!如果你还没想好要指向什么地址,那你先指向NULL,就是指向0地址,这样就不会出现致命的错误,等你想好了你再修改。
当我们已经确定指针变量要指向哪里,那你就必须在最开始写对你指向的地方的数据的类型,这样这个指针变量才能读写那个数据。否则只是指向了那个数字的首地址,要读写时,到底是取几个字节,编译器就不知道了,所以就没法读写了。
待续。。。。。