(二)while循环语句
1.While循环的过程:
首先,程序计算圆括号内的测试条件(test-condition)表达式。如果该表达式为true,则执行循环体中的语句。和for循环一样,while 循环也是一种入口条件循环。因此,如果测试条件一开始便为false,则程序将不会执行循环体。
2.for与while
for与while在本质上没有区别,我们可以将for改写成while,也可以将while改写成for。还要注意一点的是,如果省略for循环中的判断体部分,那么判断部分将默认为true,导致for循环一直循环下去(如果省略while循环的判断体,则不会通过编译)。一般情况下,我们使用for循环为循环计数,也就是如果循环次数是确定的,我们就用for循环,而如果不确定循环次数的话,我们就使用while循环。
3.在设计循环时,请记住下面几条指导原则:
(1)指定循环终止的条件
(2)在首次测试之前初始化条件
(3)在条件再次被测试之前更新条件
for循环的一个优点是,其结构提供了一个可实现上述3条指导原则的地方,因此有助于程序员记住应该这样做。但这些指导原则也适用于while 循环。
4.等待一段时间:编写延时循环
可以调用系统时钟来完成这个工作,即让程序等待一段时间再运行。
#inclede <ctime>
ctime中的clock()函数会返回一个时间,这个时间是以系统的时间单位为单位的,不是秒,而且这个返回值的类型是不确定的,有的环境是long,有的是unsigned long。解决方案,首先,CLOCKS_PER_SEC该时间常量是每秒钟包含的系统时间单位数,用系统时间除以它得到的是秒,用秒乘以它得到的是系统时间。其次,将clock_t作为clock()返回值的别名,这样我们可以用clock_t来声明一个clock()返回的变量的类型,具体的类型看系统具体的实现。
比如:float delay; cin>>delay; delay*=CLODKS_PER_SEC; clock_t start=clock(); while(clock()-start<delay);//小于delay就一直循环
5.类型别名
可以用两种方法来定义类型别名。第一是#define a b表示文中所有出现a的地方用b来表示,符号常量也可以用这种方式,作用仅仅是符号代换,并不是真正意义上的别名,有时候会出现歧义,比如#define a int *之后,当使用a声明了两个指针变量如:a pointer1,pointer2,则编译器会将其设定成这样:int* pointer1,pointer2;导致的后果是pointer2不是指针类型,与我们希望的结果不一致。第二种是采用typedef声明,比如,typedef char * byte_pointer;就是将byte_pointer作为了字符指针这种类型的一个别名,它本身是一个整体,就是char *本身,不会出现歧义。比如下面的语句是不同的:
#define FLOAT_POINTER float *
FLOAT_POINTER pa , pb;
预处理器置换将该声明转换为这样 :float *pa, pb; //pa是一个指针,而pb将是一个浮点型。
而typedef float * FLOAT_POINTER;则不会产生这样的歧义,它会使pa,pb都是浮点指针类型。
使用typedef的一个简便的记忆方法就是相当于后面跟的是变量声明,只不过这个声明出来的“变量”其实是一个可以声明其他变量的别名罢了,感觉应该使用了auto(自动类型推断)的机制来实现的。比如:typedef int a;a b;就相当于int b;。还可以给函数指针起一个别名,方法同样就是用typedef声明一个函数指针,比如typedef double * (* pdf)(int x);则pdf就是一个返回值为double指针,参数是int型的函数指针的别名,可以用它来声明函数指针并赋值。比如pdf xa=function(其中function是函数名)。
网友评论