《C Primer Plus》阅读笔记(3)
第6章 C控制语句:循环
1.while语句是一个入口条件循环,即是否执行循环的决定是在进入循环之前就做出的。
for语句也是一个入口条件循环。
do while语句是一个退出条件循环,即是否再次执行循环的决定是再执行了一次循环之后做出的。
2.逗号运算符
逗号运算符扩展了for循环的灵活性,它使您在一个for循环中使用多个初始化或更新表达式(for循环的三种动作:初始化、测试、更新)。
逗号运算符并不只限于在for循环中使用,但这是最常使用它的地方。
逗号运算符具有两个属性:<1>它保证被它分开的表达式按从左到右的次序进行运算(换句话说,逗号是个顺序点,逗号左边产生的所有副作用都在程序运行到逗号右边之前生效)。<2>整个逗号表达式的值是右边成员的值。
注意区分下面两条语句的不同作用:
houseprice = 249, 500; //houseprice将被赋值为249,整个语句为一个逗号表达式。
houseprice = (249,500); //houseprice将被赋值为500,整个语句为一个赋值语句。
逗号也被用做分隔符。在下面这两条语句中,逗号都是分隔符,而不是逗号运算符。
char ch, date;
printf("%d %d\n", chimps, chumps);
3.使用for循环还是while循环?
通常,在循环涉及到初始化和更新变量时使用for循环较为合适,而在其他条件下使用while循环更好一些。while循环对以下的条件来说是很自然的:
while(scanf("%d", &num) == 1)
而对那些涉及到用索引计数的循环,使用for循环是一个更自然的选择。例如:
for(count=1; count<=100; count++)
4.在嵌套循环中,通过使内部循环的一部分依赖于外部循环,可以使内部循环在每个周期中的表现不同。
5.现代的编程习惯是把程序的元素分为接口和实现部分,原型和定义就是这样的例子。接口部分描述了如何使用一个特性,这正是原型所做的;而实现部分说明了采取的具体动作,这正是定义所做的。
第7章 C控制语句:分支和跳转
1.C保证逻辑表达式是从左至右求值的。&&和||运算符是序列的分界点,因此在程序从一个操作数前进到下一个操作数之前,所有的副作用都会生效。而且,C保证一旦发现某个元素使表达式总体无效,求值将立刻停止。
2.条件运算符(?:)
条件运算符是一个三元运算符,当希望取两个可能的值中的一个时,可以使用条件表达式。典型的例子是将两个值中的最大值赋给变量:
max = (a>b)? a:b;
条件运算符也可以使用字符串作为它的第二和第三个操作数,例如:
printf("You need %d %s of paint.\n", cans, (cans == 1)? "can":"cans");
3.如果break语句位于嵌套循环里,它只影响包含它的最里层循环。
4.break语句可用于循环和switch语句中,而continue仅用于循环。但是,如果switch语句位于一个循环中,则可以把continue用于switch语句的一部分。在这种情况下,continue导致程序跳过该循环的其余部分,其中包括switch其余部分。
5.圆括号中的switch判断表达式应该具有整数值(包括char类型)。case标签必须是整型(包括char)常量或者整数常量表达式(仅包含整数常量的表达式)。不能用变量作为case标签。
6.switch和if else
什么时候该用switch,而什么时候又该使用if else结构呢?如果选择是基于求一个浮点型变量或表达式的值,就不能使用switch。如果变量必须落于某个范围,也不能很方便的使用switch。然而,如果可以使用switch,程序通常运行得稍快点,而且占据较少的代码。
7. goto语句
goto语句导致程序控制跳转到由指定标签定位的语句。冒号用来将被标记的语句同它的标签相分隔。被标记的语句可以出现在goto之前或之后。goto语句要“谨慎使用,或者根本不用”,但有一种goto的使用被许多C专业人员所容忍:在出现故障时从一组嵌套的循环中跳出(单条break语句仅仅跳出包含它的最里层循环)。