C

C 知识量:16 - 74 - 317

6.3 for循环><

不确定循环和计数循环- 6.3.1 -

循环可以分为不确定循环和计数循环:

  • 不确定循环是指在测试表达式为假之前,预先不知道要执行多少次循环。例如:让用户在每次循环时输入数据,以确定是否要继续循环。

  • 计数循环是指在执行循环之前就知道要重复执行多少次。要创建计数循环需要做到:1、必须初始化计数器。2、计数器与有限的值作比较。3、每次循环时递增或递减计数器。

使用计数循环时,一定不要漏掉计数器的递增或递减,否则就开启了无限循环模式。有一种更好的循环模式可以避免出现以上情况,那就是for循环。

for循环语法- 6.3.2 -

for循环将计数循环的3个行为(初始化、测试和更新)组合在一起。示例:

#include <stdio.h>

int main(void) {
    int i;
    for (i = 5; i < 10; i++) {
        printf("Body of for is going,now,i=%d\n", i);
    }
    system("pause");
    return 0;
}

关键字for后面的圆括号中有3个表达式,分别用两个分号隔开:

  • 第1个表达式是初始化,只会在for循环开始时执行一次。

  • 第2个表达式是测试条件,在执行循环之前对表达式求值。

  • 第3个表达式执行更新,在每次循环结束时求值。

完整的for语句还包括后面的简单语句或复合语句。for圆括号中的表达式也叫做控制表达式,它们都是完整表达式,所以每个表达式的副作用(例如:变量i递增)都发生在对下一个表达式求值之前。

for循环的灵活性- 6.3.3 -

for循环是非常灵活的,灵活性远超过while循环。以下是一些for循环的用法:

  • 可以使用递减运算符来递减计数器,不一定非要递增。

  • 可以让计数器递增2、5、10等等。

    for (i = 5; i < 100; i = i + 5) {;}
  • 可以用字符代替数字计数。

    char i;
    for (i = 'a'; i <= 'z'; i++) {;}
  • 除了测试迭代次数外,还可以测试其他条件。

    for (i = 5 ; i * i <= 3125 ; i++) {;} /*测试平方数*/
  • 可以让递增的量几何增长,而不是算术增长。

    for (i = 10; i <= 1000; i = i * 1.1) {;} /*每次增长10%*/
  • 第3个表达式可以是任意合法的表达式,每迭代一次都会更新该表达式。

    for (i = 2; j <= 1000; j = (++i * 5)) {;}
  • 可以省略一个或多个表达式(但是不能省略分号),只要在循环体中包含能够结束循环的语句即可。

    for (i = 1; i <= 10;) {
        i++;
    }
  • 第1个表达式不一定是给变量赋初值,也可以使用printf()函数,注意:执行循环时,第1个表达式只执行1次。

    int i = 1;
    for (printf("hello!"); i <= 10; i++) {;}
  • 循环体中的行为可以改变循环头中的表达式。

其他赋值运算符- 6.3.4 -

C语言有许多赋值运算符,其中最基本的是=,其他赋值运算符都用于更新变量,其用法都是左侧是一个变量名,右侧是一个表达式。

赋值运算符示例等价表达式
i+=100i=i+100
i-=100i=i-100
i*=100i=i*100
i/=100i=i/100
i%=100i=i%100

以上赋值运算符的优先级与=相同。这些组合形式的赋值运算符可以让代码更紧凑,生成的机器代码更高效。

逗号运算符- 6.3.5 -

逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式。例如:

#include <stdio.h>

int main(void) {
    int i;
    for (printf("hello!\n"), i = 0; i <= 10; i++, printf("step:%i\n", i)) {
        ;
    }
    system("pause");
    return 0;
}

运行结果为:

hello!
step:1
step:2
step:3
step:4
step:5
step:6
step:7
step:8
step:9
step:10
step:11

for初次循环前执行一次printf()函数,打印“hello”。此后每完成一次循环,打印一次“step”。

逗号运算符有两个其他性质:

1、保证了被它分隔的表达式从左往右求值,也就是说,逗号是一个序列点,所以逗号左侧项的所有副作用都在程序执行逗号右侧项之前发生。

x++, y = x * 3;

以上表达式中,先对x进行递增,再用于y的求值。

2、整个逗号表达式的值是右侧项的值。

x = (100, 200);

以上表达式中,x的值等于200。此外,x=100,200;等价于x=100;200;其中,200;也是一条语句,但是什么也不做。