VC案例教学之一:改造轮子一:用for方式代替所有的循环方式……
作为一个(软件)工程师,你的前辈会经常告诉你说:别总是重新自己造轮子。但实际上作为新的工程师,不会造轮子,根本就不可能成为好的工程师。因为“造轮子”是基础啊。
下面我们就和新工程师一起学习“改造轮子”:
//“改造轮子”,案例1:
//想象一下下面的程序要放在远程运行,比如永远不停机的服务器端,或者会放在卫星上发到外太空去……
#include "stdafx.h"
#include<iostream>
int main(int argc, char* argv[])
{
for(inti=0;true;++i) {
if(0==i%100000000)std::cout<<i<<std::endl;
}
return 0;
}
原型是什么?想一想?对了……
//“改造轮子”,案例1的原型:
#include "stdafx.h"
#include<iostream>
int main(int argc, char* argv[])
{
Int i=0;
While(true) {
if(0==i%100000000)std::cout<<i<<std::endl;
++i;
}
return0;
}
看到没有,用while 写(足足)多了两行(啊)!
而且要命的是 int i变量变成了非(模块内的局部的)变量--既 i 变成了 main函数的全局变量!……这搞不好和前后的同名变量混淆、冲突……那可太糟糕了。
有没感觉改造后的轮子更简单紧凑啊?
//“改造轮子”,案例2:
#include "stdafx.h"
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
//用for((((inti=0;true;++i) {循环
for( int i=0;true;++i) {
if(0==i%100000000)std::cout<<i <<endl;
if(0>i){cout<<"此时i=" <<i<<",终于满足了退出条件(真不容易啊)!"<<endl;
cout<<"(本次循环的)上一次i是什么呢?i-1="<<i-1<<endl;
break;}
}//for(inti=0
return0;
}
//“改造轮子”,案例2的”while”原型:
#include "stdafx.h"
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int i=0;
While(true) {
if(0==i%100000000)std::cout<<i<<endl;
if(0>i){cout<<"此时i=" <<i<<",终于满足了退出条件(真不容易啊)!"<<endl;
cout<<"(本次循环的)上一次i是什么呢?i-1="<<i-1<<endl;
break;}
++i;
}//for(inti=0
return0;
}
while 这样语句,貌似“出口”更灵活一些(这是不是发明while语句的初衷呢?)……但实际上,完全可以既保持for语句的紧凑,又灵活地把for的“出口”设计好(唯一、且精确)。
虽然有阅读习惯各有所爱的问题,但象 for (int =0;true;++i) 这样把所有循环的内容放在一起总会显得紧凑,不容易出错吧。
结论:轮子还是 for 做得好。
任何一个 while, do…while, 甚至 until 构成的循环都可以用for 来改造;
而且更好更紧凑。当然我是从程序阅读紧凑这方面来讲的。
高手们来反汇编一下,然后告诉大家到底那个效率更高吧。
----
附送个:
计算机科学箴言:
程序是用来给人阅读(用的),只是顺便给电脑运行(能运行得好当然更好)而已。