1.4.2 for语句
在while循环中,我们使用变量val来控制循环执行次数。每次执行while语句,都要测试val的值,然后在循环体中增加val的值。
由于频频使用像val这样的变量控制循环,因而C++(www.cppentry.com)语言定义了第二种控制结构,称为for语句,简化管理循环变量的代码。使用for循环重新编写求1到10的和的程序,如下:
#include <iostream> int main() { int sum = 0; // sum values from 1 up to 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl; return 0; } |
在for循环之前,我们定义sum并赋0值。用于迭代的变量val被定义为for语句自身的一部分。for语句
for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val
|
包含两部分:for语句头和for语句体。for语句头控制for语句体的执行次数。for语句头由三部分组成:一个初始化语句,一个条件,一个表达式。在这个例子中,初始化语句
定义一个名为val的int对象并给定初始值1。初始化语句仅在进入for语句时执行一次。条件
将val的当前值和10比较,每次经过循环都要测试。只要val小于或等于10,就执行for语句体。仅当for语句体执行后才执行表达式。在这个for循环中,表达式使用前自增运算符,val的值加1,执行完表达式后,for语句重新测试条件,如果val的新值仍小于或等于10,则执行for语句体,val再次自增,继续执行直到条件不成立。
在这个循环中,for语句体执行求和
sum += val; // equivalent to sum = sum + val |
for语句体使用复合赋值运算符,把val的当前值加到sum,并将结果保存到sum中。
扼要重述,for循环总的执行流程为:
(1) 创建val并初始化为1。
(2) 测试val是否小于或等于10。
(3) 如果val小于或等于10,则执行for循环体,把val加到sum中。如果val大于10,就退出循环,接着执行for语句体后的第一条语句。
(4) val递增。
(5) 重复第2步的测试,只要条件为真,就继续执行其余步骤。
退出for循环后,变量val不再可访问,循环终止后使用val是不可能的。然而,不是所有的编译器都有这一要求。
在标准化之前的C++(www.cppentry.com)中,定义在for语句头的名字在for循环外是可访问的。语言定义中的这一改变,可能会使习惯于使用老式编译器的人,在使用遵循标准的新编译器时感到惊讶。
回顾编译
编译器的部分工作是寻找程序代码中的错误。编译器不能查出程序的意义是否正确, 但它可以查出程序形式上的错误。下面是编译器能查出的最普遍的一些错误。
(1) 语法错误。程序员犯了C++(www.cppentry.com)语言中的语法错误。下面代码段说明常见的语法错误;每个注释描述下一行的错误。
// error: missing ')' in parameter list for main int main ( { // error: used colon, not a semicolon after endl std::cout << "Read each file." << std::endl: // error: missing quotes around string literal std::cout << Update master. << std::endl; // ok: no errors on this line std::cout << "Write new master." <<std::endl; // error: missing ';' on return statement return 0 } |
(2) 类型错误。C++(www.cppentry.com)中每个数据项都有其相关联的类型。例如,值10是一个整数。用双引号标注起来的单词"hello"是字符串字面值。类型错误的一个实例是传递了字符串字面值给应该得到整型参数的函数。
(3) 声明错误。C++(www.cppentry.com)程序中使用的每个名字必须在使用之前声明。没有声明名字通常会导致错误信息。最常见的两种声明错误是,从标准库中访问名字时忘记使用“std::”,以及由于疏忽而拼错标识符名:
#include <iostream> int main() { int v1, v2; std::cin >> v >> v2; // error: uses "v" not "v1" // cout not defined, should be std::cout cout << v1 + v2 << std::endl; return 0; } |
错误信息包含行号和编译器对我们所犯错误的简要描述。按错误报告的顺序改正错误是个好习惯,通常一个错误可能会产生一连串的影响并导致编译器报告比实际多得多的错误。最好在每次修改后或最多改正了一些显而易见的错误后,就重新编译代码。这个循环就是众所周知的编辑-编译-调试。
习题
习题1.9 下列循环做什么 sum的最终值是多少
int sum = 0; for (int i = -100; i <= 100; ++i) sum += i; |
习题1.10 用for循环编程(www.cppentry.com),求从50到100的所有自然数的和。然后用while循环重写该程序。
习题1.11 用while循环编程(www.cppentry.com),输出10到0递减的自然数。然后用for循环重写该程序。
习题1.12 对比前面两习题中所写的循环。两种形式各有何优缺点?
习题1.13 编译器不同,理解其诊断内容的难易程度也不同。编写包含本小节“回顾编译”部分讨论的错误的程序。探讨编译器产生的信息,这样你在编译更复杂的程序遇到这些信息时会比较熟悉。
【责任编辑:
董书 TEL:(010)68476606】