循环的深入理解和妙用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说起循环,其实对于用法,for循环和while循环都是很基础的,你会以为这没什么讲的。说破了不就那么回事,对吧。但是有时候,为什么计算机C语言考试或者别人的代码中,一些代码也是使用普通的循环,但是你有为什么不能够轻易看懂呢,有时候甚至犯晕看不懂,知道为什么吗?因为你学会了使用,学会了通常的用法,然后考试有时候出现了另类的用法,你一定会骂出题人变态。但是答案出来后,其实也无可厚非,并没有什么钻牛角尖的。再比如说,人家很多高手写的代码,相当精炼,执行效率很高,你也看不懂,难道也说他们变态么?我看不然。
举个例子。i为整型变量,ptr为一个指针,while(i==1); while(1);while(i);while(ptr);更复杂的就不列举了。对于初学者,或者通常不深入想这个问题的,第一个则是最为平常的,第二个还可以理解,第三个和第四个似乎没有那么直观。如果以后在开发过程中,遇到更复杂的写法,是不是就更加难以接受了。当然,这些只是举个例子。相信学过点有点基础的,这些都不会不懂。在这里只是简单举个例子而已。当然,这里谈论的不是什么高深的技巧和知识什么的,主要是帮助初学者能够清晰的认识到这些问题。如果你有其他看法,可以提出,欢迎提出,一起交流和学习。
这个问题,曾经在一个项目代码中看到了STL的迭代器的使用,使用了for循环来跟新迭代指针,它是使用迭代指针与容器结尾的后一个内存进行比较从而判断测试结果,而在for的第一个分号前不写任何代码,迭代指针是在循环前定义和初始化的。但是我开始还不太理解这种写法,因为都是之前的循环模式,习惯使用了整型来进行循环判断和大小比较,思维束缚了。但是琢磨了一会明白了,然后结合大师的编写习惯进行了代码结构的结合优化,这样就逻辑很清晰。为什么一开始看不明白呢?原因就是思维被束缚了,习惯了一般书上的那种简单的循环测试,看到了新颖的写法就犯迷糊了。其实究根追底,问题就是我没有对这个循环的循环测试理解透彻。如果理解透彻了,什么写法都能够瞬间看明白。
对于循环,最重要的是测试条件。但是有时候又可以忽略。你觉得这两句话矛盾吗?忽略的原因是因为你在循环内部使用了判断条件代替了测试条件,所以就达到了同样的效果。比如,while循环中,你可以使用一般的测试条件,如果不满足要求就退出循环,这是在循环入口处进行的判断,但是有时候需要在循环内部进行判断,这个时候就可以使循环的测试条件始终为真,然后在循环内部提供条件判断,然后可以使用continue和break来控制循环的流向。效果是一样的。至于变量最后的更新,以使判断条件有机会退出,当然也是必要的。这里说的重要,并不说其他的不重要,而是说,循环的使用,真正注意的问题是条件测试的深入理解。
所谓条件测试,就是在循环的判断的那一处执行的操作。while在开始处,do while结束处,for在循环开头括号的两分号中间。那么条件测试的核心就是逻辑判断。所以最终的问题的讨论就是这个逻辑判断了。
逻辑判断,就是表达式求值转换成逻辑值(布尔值)真和假。在C/C++中,0为假,非0即为真。始终要记住这个。但是在最终的测试结果,隐含了一步,那就是表达式的类型转换。比如,变量i的值,会根据它的值,进行判断是否为0,然后转换成布尔值,得到测试结果。通常的整型的值都是好理解的。但是,有时候,比如ptr指针,就不是那么直观了。但是我们同样以【0为假,非0即为真】这个规则来判断。空指针的值是0,非空则是非0,从而最后就可以判断出测试
结果。还有,1<2,这种典型的表达式,也不是直接的布尔值,但是表达式的记结果却是一个布尔值,因此就也很好理解。理解循环判断条件的核心,就是这个一个判断表达式的理解和非布尔类型转换成布尔类型的理解。只要记住【0为假,非0即为真】这个规则,就好了。因为所有的数据类型,变量,终究都是一个数值,都是存储在内存的一个数值,也就是一串数字的形式可以表示出来。比如,使用一个字符串变量作为判断测试条件,那么0的情况就是字符串的地址为空的时候。但是一个常量字符串始终有一个非零地址,所以测试条件始终为真,所以不要以为字符串是否为空作为条件而错误的直接把字符串作为测试条件,应该将字符串和空字符串进行比较得到测试结果。
所以,知道了测试条件的本质就是布尔值,对于任意的形式,最终都是转换成了布尔值,最后进行真假判断的。所以,循环的测试条件变为奇怪的表达式,也不要惊慌,通过【0为假,非0即为真】的规则,最终将表达式的值转换成布尔形式,你就能够知道测试结果了。这个转换就是这个规则加上前面说的所有变量和形式,终究都是一个二进制数值表示在内存的。除非二进制的是全零,否则就是真。
深刻掌握了这个概念,以后使用判断规则是,你就可以随便使用指针,变量,表达式,函数等作为测试条件了。在这个测试过程中,首先是求出你给出的形式的值,然后转换成布尔值,进行最后测试判断。所以,如果是函数,那么一定先执行函数求得函数返回值,最后再将函数返回值转换成布尔值,得到测试结果。如果在测试表达式中,创建了一个进程或者线程,那么你可以通过进程或者线程给你返回一个值,然后根据这个值进行转换和判断。所以,如果见到了这样的写法,就不用奇怪了,这样的用法确实是可以的,只要深深的理解了这个测试的意义,你就能够运用自如了。
当然,本文没什么深度,主要是通过给出深入的理解发散思维,给大家理解其他知识和本知识提供一个理解方向。什么知识都这样理解,那你就能够以很高的效率和质量学会很多东西。这样深入认识后,你就能够灵活运用和理解别人的代码了,它再奇葩也逃不出这个规则,人家再怎么考你,都不起作用了。
好了,那祝你早日学有所成吧。有不同的见解,请留言。我希望得到更多不同于我的看法,可以扩展我的思维。当然都是相互学习哦。