(四)语句形式 -- 7 for语句

7. for语句

C语言中最重要的一个控制语句就是for语句。它经常在将一个操作重复执行特定次数的情况下使用。

init表达式指出for循环应该如何初始化,通常用于设置下标变量的初始值。
例如语句:

for (i = 0; . . .

表示循环开始时将下标变量i初始化为0。


test表达式是和while语句中的控制条件要求一样的条件测试。只要测试表达式的值为TRUE,循环就会继续。
例如语句:

for (i = 0; i < n; i++)

表示该循环开始时i的值为0,当i小于n时继续下一个循环周期,它最终共有n个周期。


step表达式表示下标变量的值在各个周期中如何变化。



表达式init、test和step中的每一个都是可选的,但它们中间的分号是必需的。
如果init不出现,则将不执行任何初始化操作;
如果test不出现,则将假设条件测试为TRUE;
如果step不出现,则在循环的周期间将不执行任何操作。

这样控制行就成了:

for ( ; ; );

它等效于

while (TRUE)

代码示例

#include <stdio.h>

/* Count down to zero. */

#define StartingCount 10

main() {
    
    
    int i; 
    
    for (i = StartingCount; i >= 0; i--)
    {
    
    
        printf("%d\n", i);
    };
}


7.1 嵌套的for循环

当程序变得越来越复杂时,常常需要将一个for循环嵌入到另一个for循环中去。

在这种情况下,内层的for循环在外层循环的每一次迭代中都将执行它的所有的周期。

每个for循环都要有一个自己的下标变量以避免下标变量间的互相干扰。


代码示例

#include <stdio.h>

/* multiplication table */

#define LowerLimit 1
#define HigherLimit 5

main() {
    
    
    int i, j;
    
    for (i = LowerLimit; i <= HigherLimit; i++) {
    
    
        for (j = LowerLimit; j <= HigherLimit; j++) {
    
    
            printf(" %4d", i*j);
        };
        printf("\n");
    };
}


7.2 for和while的关系

事实上, 以下的for语句和while语句是等效的:

for (init; test; step) {
    
    
	statements
}
init;
while (test) {
    
    
	statements;
	step;
}

尽管for语句可以很轻易地用while改写,但在适当的情况下使用for是大有好处的。

在for语句中,所有需要了解的关于将要被执行的循环周期的信息都包含在语句的控制行中,从而利于避免遗漏。



7.3 浮点型数据的使用问题

由于for循环中的init、test和step部分可以是任何表达式,所以没有任何明显的理由要求for循环的下标值必须是整型。

例如下面这个for循环:

main() {
    
    
    double x;
    for (x = 1.0; x <= 2.0; x += 0.1) {
    
    
        printf("%.1f\n", x);
    };
}

当它在某些计算机上运行时,会产生以下输出:

从循环控制来看,本应显示的值2.0丢失了。


问题出在浮点数并不是百分之百精确的。

比如,浮点型值0.1很接近于数学上的分数1/10,但它们并不精确地相等。

每当下标变量x加0.1时,误差就被累计,到最后与2.0比较来决定是否结束循环时,x的值可能就成了2.000000001或类似的不是小于或等于2.0的数。

这样,for循环的条件不满足,则它在少运行一个周期的情况下就退出了。


解决这个问题的最好方法就是限制只能用整型作为for循环的变量。

因为整型是精确的,不会造成上述问题。

假如一定要从1.0起累加0.1到2.0,可以采用从10累加1到20,再将它除以10:

main() {
    
    
    int n;
    double x;

    for (n = 10; n <= 20; n++) {
    
    
        x = n / 10.0;
        printf("%.1f\n", x);
    };
}

除了for循环外,在其他一些情况下同样需要警惕比较浮点型数据会引发的问题。

考虑到浮点型数据在特定计算机内存储精度限制,一些看起来相等的数字可能并不能完全相等。



参考
《C语言的科学和艺术》 —— 第4章 语句形式

猜你喜欢

转载自blog.csdn.net/m0_38111466/article/details/108908028