对 C++ Primer 练习 1.11 的思考

题目:编写程序,提示用户输入两个整数,打印输出这两个整数所指定范围内的所有整数。

这道题对于任何 C++ 新手程序员来说都不难,问题在于它出现的位置在书中 while 知识点后,而关于 if-else 语句和 == 运算符是在后面才提到的。后面也有对应的练习要求使用 if-else 语句重写此题,所以这题只能用 while 来写。我在网上,包括 C++ Primer 的中文习题集中都没有看到一个让自己满意的答案,索性自己写了一个。

这一题对于纯编程新手来说可能更简单一些,因为程序顺序执行,所以可能会更加自然地想到使用两个 while 语句。不过如果你忽略了对输入的两个值的大小情况分析的话,这题是写不对的。有经验的程序员由于思维定势,对于多情况的情景,会直接去使用 if-else 语句,当然这样的代码可读性更强,可换个角度来看,只使用 while 和一些小技巧来实现同样的效果,是不是更有助于理解它的使用呢?

我们先看看使用了 if-else 的写法,比较直接:

#include <iostream>
int main()
{
    std::cout << "Please enter two number: ";
    std::cout << std::endl;
    int v1, v2;
    std::cin >> v1 >> v2;
    if (v1 <= v2)
    {
        while (v1 <= v2)
        {
            std::cout << v1 << " ";
            v1++;
        }
    }
    else // v1 > v2
    {
        while (v1 >= v2)
        {
            std::cout << v1 << " ";
            v1--;
        }
    }

    return 0;
}

当强迫你不能用 if-else 时,便需要利用语句的特性了:

#include <iostream>
int main()
{
    std::cout << "Please enter two number: ";
    std::cout << std::endl;
    int v1, v2;
    std::cin >> v1 >> v2;

    while (v1 < v2){
        std::cout << v1 << " ";
        v1++;
    }

    while (v1 >= v2){
        std::cout << v1 << " ";
        v1--;
    }

    return 0;
}

注意到了吗,如果 v1 < v2,两个 while 都会被执行,而且第二个 while 只执行一次(针对 v1==v2)的情况。如果 v1 >= v2 ,前一个 while 被跳过,后面的语句并不难理解。为什么要这样写呢?这就是考虑到程序顺序执行的特点而做的一些小技巧,其它的写法要么不够简洁,要么不好处理 v1==v2 的情况。如果你一开始就能想到这种写法,说明你的思路还是很敏捷的。大部分 ACM-ICPC 选手会经历一个阶段,热衷于将代码量压缩到极致,虽然牺牲了可读性(避免被 Hack),但是其中的乐趣还是很多的。

猜你喜欢

转载自www.cnblogs.com/accepteddoge/p/cpp-primer-ex01-11.html
今日推荐