第三章 分支结构
if-else中的猫腻
两个并列的if
mynumber = 38;
scanf ("%d", &yournumber);
if(yournumber == mynumber){
printf("Right");
}
if(yournumber > mynumber ){ //这里不是else if,即这里的判断不在上一个if不成立的前提下
printf("Big");
}else{
printf("Small");
}
if后的马上分号
double grade;
scanf ("%lf", &grade);
if(grade < 60); { //注意这里的分号,即if已经结束
printf("Fail");
}
printf("?");
在if (表达式) 中用赋值语句
int k, flag;
if (k = 0) { //k赋值为0后,用k来判断是否为true
flag = 0;
} else {
flag = 1;
}
但是不能在逻辑运算符后赋值
int k=1, flag;
if (k = 0 && k==1) { //先赋值编译是可以通过的
flag = 0;
} else if(k = 0 && k==1){ //后赋值编译无法通过
flag = 1;
}
switch中的猫腻
switch (表达式)
可以是常量、变量、常量表达式、变量表达式
注意,常量不只有数值类型,变量也是
switch(9){}
switch(1+1){}
switch(choice){}
switch(choice* choice+1){}
case 常量表达式n:
- 不能含有变量,只能是常量或常量表达式
- 常量表达式的结果不能重复(编译错误)
填空题易漏" break; "
没有break时的执行顺序
[例] 从判断到的位置开始顺序执行,default的位置任意且(无break时)影响结果
switch(op){
case '+': printf("%d", value1 + value2);
default: printf("Error");
case '-': printf("%d", value1 - value2);
}
当op为’+‘时,从case ‘+’:后面顺序输出;
当op为’/‘时,从default:后面顺序输出;
当op为’-'时,从case ‘-’:后面顺序输出。
输出的空格/换行控制
坑人的空格填空题…
[例1]
输入一个正整数n,再输入n个字符,将这些字符输出,输出时在字符之间加一个空格,最后一个字符的后面没有空格。
# include <stdio.h>
int main()
{
char ch;
int first = 1, k, n;
scanf("%d\n", &n);
for(k = 1; k <= n; k++){
________________ //填空①
if ( first == _______ ) //填空②
{
putchar(ch);
________________ //填空③
}else{
________________ //填空④
putchar(ch);
}
}
return 0;
}
[例2]
输入一个正整数n,再输入n个整数,输出其中的偶数。要求相邻数字中间用一个空格分开,行末不得有多余空格。
# include <stdio.h>
int main()
{
char ch;
int first, k, n, x;
scanf("%d", &n);
________________ //填空①
for(k = 1; k <= n; k++){
scanf("%d", &x);
if ________________ //填空②
{
if ( first == 1 ){
printf("%d", x);
________________ //填空③
}else{
________________ //填空④
}
}
}
return 0;
}