C++ 初学者指南 第三篇(3)

必备技能3.3:for循环
    在第一章节中我们就用到了for循环的简单形式。但是for循环的强大和灵活绝对会让我们感到吃惊。让我们还是先来回顾一下for循环最基本的最传统的形式吧。
重复执行一条语句的简单的for循环如下:
for ( 初始化; 表达式; 自增) 单条语句;
重复执行一段代码的for循环的通用形式如下:
for ( 初始化; 表达式; 自增)
{
    语句序列
}
上面的初始化通常是一个给循环控制变量赋值的语句,这个变量像一个计数器一样可以控制循环的次数。其中的表达式是一个条件表达式,它决定了是否需要重复执行循环体中的代码。其中的自增语句则表达了每次循环后控制变量的变化是多少。请注意上面这三个主要的部分必须是用分号间隔的。只要表达式部分检测的结果为true,循环就一直进行。一旦表达式的检测结果为false了,就会退出循环,程序会继续执行for循环后面的语句。
    下面的程序使用了一个for循环来打印1到99 之间的数字的方根。请注意,在这个程序中,循环的控制变量是num。
// Show square roots of 1 to 99
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    int num;
    double sq_root;
 
    for ( num = 0; num < 100; num++)
    {
        sq_root = sqrt ((double) num);
        cout << num << " " << sq_root <<'\n';
    }
   
    return 0;
}
在这个程序中使用到了标准的库函数sqrt()。正如在第二篇中介绍的那样,函数sqrt()返回他的参数的方根。它的参数必须是double类型的,函数的返回值也是double类型的。这里头文件<cmath>是必须的。
for循环可以以增加的方式进行,也可以以减小的方式进行,其实对控制变量的增加量也是可以取任意值的。例如,下面的程序打印数字50到-50,控制变量时减少10 。
// A negatively runing for loop
#include <iostream>
using namespace std;

int main()
{
    int i;

    for ( i = 50; i >= -50;  i = i -10 ) cout << i << ' ';
   
    return 0;
}
输出的结果如下:
50 40 30 20 10 0 -10 -20 -30 -40 -50
非常重要的一点是其中的条件表达式的检测总是在循环之前进行的。这就是说for循环的循环体有可能不会被执行,如果条件表达的检测一开始就是false。下面就是一个例子:
 for ( count = 10; count < 5; count++ )
        cout << count; //这条语句是不会被执行的。

专家解答:

问:C++中是否支持除了sqrt()之外的其它的数学函数?
答:是的!除了sqrt()之外,C++支持广阔的数学库函数。例如:sin(),cos(),tan(),log(), ceil(),还有floor(),这些只是其中的一部分。如果你主要进行和数学相关的编程,那么你可以研究一下C++的数学库。所有的C++编译器都支持这些库函数。你可以在编译器的文档中找到这些函数的描述。它们都需要头文件<cmath>。

for循环的一些变化
    for循环是C++语言中最通用的语句之一。因为它提供了非常灵活的变化。例如,我们可以使用多个循环控制变量。考虑下面的代码片段:
for ( x= 0, y = 10; x<=y ;++x, --y ) //这里使用了多个循环控制变量
    cout << x << ' ' << y << '\n';
这里在两个变量的初始化和自增表达式中间都用了逗号间隔。这样做是为了告诉编译器有两个初始化语句和两个自增语句。在C++中,逗号是一种运算符,它的意思是“做这个和这个”。它是在for循环中经常使用的。我们可以有任意多的初始化和自增语句,但是实际上使用多于两个或者三个以上的初始化和自增语句是非常令人难懂的。
    条件控制语句可以是任意的有效的C++表达式。它也可是不必含有循环控制变量。在下一个例子中,循环回一直执行,直到rand()函数产生一个大于20,000的数字。
/* Loop until a random number that is
   greater than 20,000
*/
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int i;
    int r;

    r = rand();
    for ( i = 0; r <= 20000; i ++) // 这里的条件表达式没有使用循环控制变量
        r = rand();
   
    cout << "Number is  " << r << ". It was generated on try " << i << ".";
   
    return 0;
}
上面程序可能的输出如下:
Number is  26500. It was generated on try 3.
在上面的每次循环中,通过调用函数rand()生成一个新的随机数。当生成的随机数大于20,000的时候,循环的条件就变成了false, 循环就终止了。

for循环还可以缺少某些部分
    C++中的for循环和其它计算机语言相比还有一点需要注意,那就是循环的定义可以缺少某些部分。例如,我们想些一个循环,直到用户从键盘键入123,那么可以这样写:
// A for loop with no increment.
#include <iostream>
using namespace std;

int main()
{
    int x;

    for ( x= 0; x !=123 ; ) //这里缺少了自增表达式
    {
        cout << "Enter a number: ";
        cin >> x;
    }
 
    return 0;
}
在这个程序中,for循环定义的自增表达式部分是空缺的。这就是说,每次执行完循环体后,接着去检查看x的值是不是等于123,而不是循环体执行后,执行自增运算,然后才去检查x的值。如果我们从键盘键入123,那么for的控制条件就变成了false,循环也就结束了。for循环中如果没有自增表达式,那么控制变量是不会被修改的。
    还有一种变化的形式如下,就是把把初始化部分放置在for循环的外部。
    x= 0;
    for ( ; x < 10 ; ) //这里缺少了自增表达式
    {
        cout<< x <<' ';
        ++x;
    }
这里,for的初始化部分为空,x是在进入循环之前进行的初始化。通常只有在初始化值是通过一个复杂的计算过程得到的,而这个过程由于比较复杂而不适合放置在for语句中。请注意:这个例子中自增的部分也被移植到了循环体的里面。

无限循环
    我们可以使用下面的形式来创建一个无限的循环,也就是永远都不会结束的循环。
for(;;)
{
    //...
}
这个循环会一直执行下去。尽管有诸如操作系统的命令处理器之类的程序需要这样的无限循环,但是大多数的“无限循环”实际上都是有特殊的要求的。本篇章的最后,我们可以看到如何终止这样的循环。(提示:通过使用break来终止这样的循环。)
无循环体的循环
    在C++中,for循环的循环体可以是空的。这是因为空语句在语法上是正确的。无循环体的循环通常是有用的。例如,下面的程序就是使用了一个无循环体的循环来计算1到10之间的数字之和。
// The body of a for loop can be empty.
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int i;
    int sum = 0;

    for ( i = 1; i <= 10 ; sum += i++ ) ; //没有循环体的for循环

    cout << "Sum is " << sum;

    return 0;
}
程序的输出如下:
Sum is 55
注意上面的累加运算完全是在for语句中完成,for循环无循环体。需要特别注意自增运算表达式:
sum += i++;

在for循环中声明循环控制变量
    通常,控制for循环的变量仅仅是为了for循环而使用的,别的地方不需要使用它。在这种情况下,我们可以在for循环的初始化部分声明这个变量。例如,下面的程序计算了1到5的累积和与阶乘。控制变量i是在for循环中声明的。
// Declare loop control variable inside the for
#include <iostream>
using namespace std;

int main()
{
    int sum = 0;
    int fact = 1;

    //计算到的阶乘
    for ( int i = 1; i <= 5 ; i++ )
    {
        sum += i; // i 在循环中是可用的。
        fact *= i;
    }
    //但是在循环外,i是不可用的。
    cout << " Sum is " << sum << "\n";
    cout << " Factorial is " << fact;

    return 0;
}
程序的输出如下:
 Sum is 15
 Factorial is 120
我们在for循环中声明变量的时候,有一点需要注意,就是这个变量只能在for循环中使用。即,以程序的语言来说,这个变量的范围仅限于这个for循环。for循环外,这个变量就不存在了。因此,在上面的例子中, i在for'循环外面是不可用的。如果在程序的其它地方需要使用到这个循环控制变量,我们就不能再for循环中声明这个变量。
注意:
    for循环中定义的变量是否在其它地方可以使用是随着时间有所变化的。起初,for循环中声明的变量在for循环之后是可以使用的,但是这点在C++标准化的过程中有所改变。时至今日,ANSI/ISO标准C++把变量的范围限制到了for循环内。然而一些编译器则不是这样的。大家需要各自检查自己的编译器是否有这个限制。
    在继续学习之前,我们可以自行实验一下,自己写一些for循环的变体。你会发现,for循环是非常有吸引力的。

练习
    1. for循环是否允许缺少某些部分?
    2. 如何使用for来创建一个无限循环?
    3. for语句中声明的变量的范围是什么?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值