本课重要知识点:
1.知识点:if语句
第 16 页 共 78 页
? if(表达式),其中表达式可以是任意合法的C语言表达式。 b=c;} 例1:(2011-09-19)下列条件语句中输出结果与其他语句不同C)if(a>b) c=a;a=b;b=c; D)if(a>b){ c=a;a=b;的是(D) b=c;} A.if(a) printf(“%d\\n”,x); else printf(“%d\\n”,y); 【解析】对于单个if语句,其后跟随的受if控制的只能是1B.if(a==0) printf(“%d\\n”,y); else printf(“%d\\n”,x); 个语句或者是1个复合语句。故C项,if(a>b)条件成立时,语C.if(a!=0) printf(“%d\\n”,x); else printf(“%d\\n”,y); 句c=a;才被执行,而无论if(a>b)条件成立与否,语句a=b;b=c;D.if(a==0) printf(“%d\\n”,x); else printf(“%d\\n”,y); 都会被执行。A、B、D项,只有if(a>b)条件成立时,语句c=a; 【解析】作为if语句的条件,a等价于a!=0,因此 A和C是a=b;b=c; 才被执行。 等价的。 例2:(2011-03-26)以下程序运行后的输出结果是 200 例2:(2011-03-26)if语句的基本形式是:if(表达式)语句,以下关于“表达式”值的叙述中正确的是(D)
A)必须是逻辑值 B)必须是整数值 C)必须是正数 D)可以是任意合法的数值
【解析】表达式不限于关系表达式、逻辑表达式,也可以是任意的数值类型,其中非0为真,0为假。故选D。
}
【解析】x=10,y=20,所以x==y为false,t=x;不执行,直接执main()
{ int x=10,y=20,t=0; if(x==y)t=x;x=y;y=t; printf(\
? 对于单个if语句,其后跟随的受if控制的只能是1个语句
行x=y;y=t;x为20,y为0。注意和if(x==y){t=x;x=y;y=t;}区别。 或者是1个复合语句。
例1:(2009-09-17)设有定义:int a=1,b=2,c=3;以下语句中执? 当多个if(表达式)单分支形式并行出现时,其执行顺序是:行效果与其它三个不同的是(C) 先判断第一if单分支的条件,如果为真,执行其后面的语A)if(a>b) c=a,a=b,b=c; B)if(a>b){ c=a,a=b,句,执行完后,继续向下执行。判断第二个if单分支语句,
第 17 页 共 78 页
依次类推。如果第一个if表达式的值为假,则不执行其后例2:(2010-09-18)有以下程序 的语句,而去判断第二个if单分支条件。 #include
main() 例1:(2011-03-26)有以下程序
{int a=1,b=0;
main() if(!a) b++;
else if(a==0) if(a) b+=2; { int x;
else b+=3;
scanf(\printf(“%d\\n”,b);
}程序运行后的输出结果是(A)
if(x>15) printf(\
A)0 B)1 C) 2 D)3
【解析】else总是与前面最近的且未曾配对的if语句配对,组if(x>10) printf(\
成一对if-else语句。即else b+=3;
if(x>5) printf(\
与if(a) b+=2;配对。if(!a)不成立,不执行b++;else if(a==0)不成
if(a) b+=2; }若程序运行时从键盘输入12<回车>,则输出结果为 立,不执行
else b+=3;故直接执行printf(“%d\\n”,b);,输出结果为0。
1217 3.知识点:条件表达式
【解析】输入12,比较不大于15所以不执行if(x>15)内的语? 一般形式:表达式1?表达式2:表达式3
? 执行过程:表达式1的值为真,条件表达式取表达式2的
句;大于10执行printf(\输出12;大于5执行值;表达式1的值为假,条件表达式取表达式3的值。
例1:(2009-09-19)以下程序段中,与语句:k=a>b?(b>c?1:0):0;
printf(\输出17。
功能相同的是(A)
2.知识点:if语句的嵌套 A)if((a>b)&&(b>c)) k=1; B) ? 内嵌结构中,else总是与前面最近的且未曾配对的if语句if((a>b)||(b>c)) k=1; 配对,组成一对if-else语句。
第 18 页 共 78 页
else k=0; else k=0; C) if(a<=b) k=0; D) if(a>b) k=1;
else if(b<=c) k=1; else if(b>c) k=1;
else
k=0;
【解析】条件运算符的结合性是从右至左。当b>c时,b>c?1:0的值为1,k=a>b?1:0,同时当a>b时,a>b?1:0的值为1,此时k=1。否则k=0。故答案为A。 4.知识点:switch语句
? switch语句的圆括号中的表达式的值必须是整型或字符型,不能为实型。
? case后的表达式可以是求得整型和字符型的常量表达式,但不能含有变量。
? default的位置对程序的执行没有影响。 例1:(2010-09-19)若有定义语句int a,b;double x;则下列选项中没有错误是(C)
A)switch(x%2) B) switch((int)x%2.0)
{case 0:a++;break; {case 0:a++;break;
case 1:b++;break; case 1:b++;break;
default:a++;b++; default:a++;b++;
} } C)switch((int)x%2) D)switch((int)(x)%2)
{case 0:a++;break; {case 0.0:a++;break;
case 1:b++;break; case 1.0:b++;break;
default:a++;b++; default:a++;b++;
} } 【解析】switch语句的圆括号中的表达式的值必须是整型或字符型,不能为实型。x是double型,x%2不合法,A项错误。(int)x%2.0不合法,B项错误。(int)x%2值为整型,故C项正确。case后面的表达式可以是求得整型量和字符型量的常量表达式,故D项错误。 例2:(2009-09-18)有以下程序 #include
for(k=1;k<3;k++)
第 19 页 共 78 页
switch(k)
{ int s;
{default:c+=k; case 2:c++;break; scanf(\case 4:c+=2;break; }
while(s>0) printf(“%d\\n”,c);
{ switch(s) }程序运行后的输出结果是(A)
A)3 B)5 C)7 D)9
{ case1:printf(\【解析】当k=1时,没有匹配的case,执行default语句, case2:printf(\c=c+k=0+1=1。继续往下执行case 2后边的语句,c++,c变为2,遇到break语句,于是退出内层switch结构。当k=2时, case3:printf(\找到匹配的case 2,执行c++; c变为3,遇到break语句,于 default:printf(\是退出内层switch结构。执行外层循环for结构的k++,k变为3,k<3不成立,跳出for语句。最后输出结果为3。
}
? 当switch语句和循环语句(for、while)时,要注意switch scanf(\
里面的break语句退出的位置。解决这一问题的方法是:首先划分结构,确定循环的语句体包括哪些语句。然后, }
在继续划分循环体内的语句,如果循环体内的语句只有一条switch语句,其内部出现了break,遇到break,要结束当 } 运行时,若输入1 2 3 4 5 0<回车>,则输出结果是前switch语句的执行,继续执行下一次循环。 (A)
例1:(2011-03-26)有以下程序 A)6566456 B)66656 main()
D)6666656
第 20 页 共 78 页
C)66666