小结
概念与术语
■ 如果算法中有需要反复执行的动作,可将这些动作将写成循环体内的语句或()内的表达式。
■ while语句的执行过程是:首先求()内表达式的值,如果这个值不为0则执行()后的语句,然后再次求()内表达式的值;如果()内表达式的值为0,则while语句结束。
■ C语言的3种循环语句都可以实现次数一定的循环,也都可以实现次数不确定的循环。
■ 在编写循环语句时,对于定数循环,一定要注意记数器变量的初值、终值并正确地写出循环条件保证循环次数的正确性。对于非定数循环,要特别注意正确地写出循环条件。
■ +=、-=、*=、/=、%=这几种复合赋值运算符有和赋值运算符=有相同的优先级和结合性。
■ 作为“计数器”的循环变量应当是整数类型。
■ scanf()函数调用表达式的值为正确地转换了的数据的个数。
■ “,”是一二元运算符,求值过程为先求“,”左面表达式的值,再求“,”右面表达式的值,这就是整个表达式的值。
■ 在函数调用时,如果需要逗号表达式作为参数,需要把该逗号表达式写成初级表达式,即,用“()”括起来。
■ do-while语句的执行过程是:执行do关键字后的语句;求()内表达式的值,如果这个值不为0,则继续执行do关键字后的语句,如果()内表达式的值为0,则do-while语句结束。
■ for语句的()内有两个“;”。
■ for语句的执行过程是:首先求()内第一个“;”前面表达式的值;再求()内第一个和第二个“;”之间的表达式的值,如果这个值不为0,则执行()后的语句,然后求()内第二个“;”之后表达式的值,再求()内第一个和第二个“;”之间的表达式的值;如果()内第一个和第二个“;”之间的表达式的值为0,则for语句执行结束。
■ 有两种++运算符,——运算符也有两种。
■ ++(及——)运算符的运算对象必须是左值表达式。但其运算结果是一个右值。
■ 表达式i++的含义是求i的值,副效应是在下一序点前,求i值之后完成i=i+1的副效应。
■ 表达式++i的含义是求i的值,副效应是在上一序点后,求i值之前完成i=i+1的副效应。
■ 序点之前要求计算机执行的运算及副效应在序点处必须完成。
■ 相邻两序点之间,参与运算的变量(对象)的值最多只能改变一次,且必须是在所有读这个对象值之后发生。
■ break语句也可以用于循环语句中,作用是结束break语句所在的最内层的循环语句。
■ continue语句用于循环语句,作用是转入循环语句的()内继续执行循环语句。
■ 穷举法是一种把问题所有的可能解罗列出来并逐个检验是否是问题的解的算法。
■ 循环语句的嵌套结构常用于描述穷举法。
风格与习惯
■ 在写do-while语句时,首先把语句写成:
然后再写()中的表达式及{}内的语句,会减少很多不必要的错误和麻烦,同时可以使代码更加具有可读性。while语句,for语句也可以类似处理。实际上这也是结构化程序设计思想的一个体现。
常见错误
■ 在for()、while()后面随手加分号。
■ 忘记do-while()语句后面的分号。
■ 把++运算用于非左值表达式,例如++(i+1)。
■ 控制循环次数的表达式错误,引起死循环。
■ 控制循环次数的表达式错误,造成循环次数多一次或少一次。
■ while、for、continue等关键字书写错误。
■ 将for语句()中的两个“;”写成“,”或()中缺少“;”。
■ 在循环体内改变循环变量的值造成语意错误。
■ 以非整数类型作为循环变量。
■ 在两个相邻序点之间改变同一对象的值两次或更多次。
■ 将“++”写成“++”(两个+之间有空格),这个错误的可怕之处在于难以查找,因为“++i”和“++i”都是合法的,但其含义则是天壤之别。
■ 用于存放和的变量忘记事先清0。
牛角尖
■ 在表达式++i中,很难说清楚i究竟是作为左值还是右值出现的。一方面,由于++i的意义是求i的值,这表示i是一个右值;另一方面,由于++i具有与i=i+1同样的副效应,这要求1必须是左值。
■ whi1e(1){/……/}和for(;;){/……/}都是所谓的无限循环语句。这两种句型可能在很特殊的情形下使用。
■ 各种语句嵌套在一起可能构成非常复杂的结构,下面就是一个例子。
下面程序片段执行后,sum的值为何?