【C++进阶】for循环以及for循环运行机制
for (expr1; expr2; expr3)
statement
第一个表示式只在循环开始前执行一次并且无条件执行。
第二个表示式从第一次执行循环开始就在循环开始前运行做一次判断该表达式布尔值,是真就执行循环,是假就中断。如果第一次循环就是假,直接不执行for体。
第三个表达式从第一次执行循环开始就在每次循环结束后执行一次。
开篇
几乎每种程序设计语言的语法中都会有语句的循环,跳转。像最为熟知的C语言便有 for 、 while 、 do---while 等等。这些循环一般都很容易理解和使用,对于程序中逻辑的实现也很有帮助。
只是很多人不曾知道,这些循环、跳转在计算机内部、在底层是如何实现的,于是在出现问题时还是没有好的解决办法,或者是虽然写出来程序,对于内部的逻辑,却还是隔了一层迷雾。
比如有人对这样一个问题:
for( i=0 ; i< 10 ; i++)
{
printf(”%i“,i);
}
for语句里面的 i++ 是什么时候执行的呢? 当循环开始时,是先执行括号里的 i++ 还是printf(”%i“,i)? 也就是说 ,第一个打印的数字是0 还是 1?
我相信这个问题很多人都遇到过,就是当for 循环结束后 i 的值到底是多少不是很确定,在这个问题上犯难,是在不值得。如果你也曾有过这种疑问,那么这篇文章就很值得继续看下去。
这篇文章将拨开迷雾,让你看到循环的本质。
这篇文章主要谈一下C中的这些循环, 跳转语句的内部实现机制。通过深入了解他们的内在,将让你在编程的时候逻辑更加清晰,出现问题的时候也更容易排查。
注:这篇文章中会涉及到一些基本的汇编知识,我们将通过分析 for 、 while 、 do---while 等的汇编表示形式,来弄清楚他们的实现机理。
if--else
if--else是基本的条件转移控制指令,也可以说是程序循环跳转实现的基础。
先看一个具体的例子,函数absdiff()比较两个参数x,y 的大小,返回他们差的绝对值。
我们创建了对于的C语言版本(a)、goto形式的版本(b)、 以及其对应的汇编形式(c):
创建goto版本是为了能更好的理解他的汇编形式。因为里面的goto语句很类似于汇编中的跳转语句。
(a)中 的C代码应该不用多做解释了吧,大家应该都能看懂。
(b)中的got0语句形式:第4 行是一个跳转语句,跳转到执行第8 行。也就是说当第3 行的条件满足的时候,跳转到第8 行执行。如果第3 行的条件不满足,则执行第 5 行的语句。 然后无条件跳转到代码的结尾:“ goto done;” 使用goto 语句通常被认为是一种不好的 编程风格,因为这样的语句通常难于调试和阅读,这里使用goto语句是为了构造出一种类似汇编实现的C语句。
(c)就是我们要讨论的重点了。其实条件跳转指令的汇编形式和他的goto形式有一定的相似之处。有语句跳转的时候都是这样的过程:先判断是否满足某个条件,如果满足,则跳到一个指定的的代码段继续执行程序,如果不满足&