if语句
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
一、if语句的三种形式
C语言提供了三种形式的if语句:
1.if(表达式)语句
例如:
if(x>y)printf("%d",x);
2.if(表达式)语句1else语句 2
例如:
if (x>y) prntf("%d",x);
else printf("%d",y);
3.if(表达式1) 语句1
else if(表达式2) 语句2
else if(表达式 3) 语句3
.
.
.
else if(表达式m) 语句m
else 语句 n
例如:
if(number>500) cost=0.15;
else if(number>300) cost=0.10;
else if (number>100) cost=0.075;
else if (number>50) cost=0.05;
else cost=0;
说明:
(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。例如,if(a==b&&x==y)printf("a=b,x=y");在执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,若表达式的值为非0,按“真”处理,执行指定的语句。假如有以下if语句:
if(3)printf("O.K.");
是合法的,执行结果输出“O.K.”,因为表达式的值为3,按“真”处理。由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括整型、实型、字符型、指针型数据例如,下面的if语句也是合法的:
if('a') printf("%d",'a');
执行结果:输出a的ASCII码97。
- 第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有分号。例如:
if(x>0)
print ("%f",x):
else
printf("%f",-x)
If、else各有一个分号
这是由于分号是C语句中不可缺少的部分,这个分号是if语句中的内嵌语句所要求的。如果无此分号,则出现语法错误,但应注意,不误认为上面是两个语句(if语句和else语句)
。它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的 一部分,与if配对使用。
(3)在if和else面可以含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。如:
if(a+b>c &&b+c>a && c+a>b)
{s=0.5*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%6.2f",area);}
else
printf("it is not a trilateral"};
注意在第4行的花括号“}”外面不需要再加分号。因为{}内是一个完整的复合语句,不需另附加分号。
例1输入两个实数,按代数值由小到大的次序输出这两个数。
这个问题的算法很简单,只需要作一次比较即可。对类似这样简单的问题可以不必先写出算法或画流程图,而直接编写程序。或者说,算法在编程者的脑子里,相当于在算术运算中对简单的问题可以“心算”而不必在纸上写出来一样。
程序如下:
main()
{
float a,b,t;
scanf("%f, %f",&a,&b);
if(a>b)
{t=a;a=b;b=t;}
printf("%5. 2f,%5.2f\n",a,b);
}
运行情况如下:
3.6,-3.2
-3.20,3.60
例2输入3个数a,b,c,要求按由小到大的顺序输出。
解此题的算法比上一题稍复杂一些。可以用伪代码写出算法;
ifa>b将a和b对换 (a是a,b中的小者)
ifa>c将a和c对换 (a是a,c中的小者,因此a是三者中最小者)
ifb>c将b和c对换 (b是b,c中的小者,也是三者中次小者)
然后顺序输出a,b,c即可。
按此算法编写程序:
main()
{
float a,b,c,t;
scanf("%f,%f,%f”,&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;} /*实现a和b的互换*/
if(a>c)
(t=a;a=b;c=t) /*实现a和c的互换*/
if(b>c)
(t=b;b=c;c=t;) /*实现b和c的互换*/
printf("%5.2f,%5.2f,%5.2f/n",a,b,c)i
运行情况如下:
3,7.1
1.00,3.00,7.00
二、 if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:
if( )
if( ) 语句1
else 语句2内嵌if
else
If ) 语句3
else 语句4内嵌 if
应当注意if与else的配对关系。else总是与它上面的最近的未配对的if配对。假如写成:
if( )
if( ) 语句1
else
If( ) 语句2
else 语句3 内嵌 if
编程序者把else写在与第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是与第二个if配对,因为它们相距最近。因此最好使内嵌if语句也包含 else部分,这样if的数目和else的数目相同,从内层到外层一一对应,不致出错。
如果if与else的数目不一样,为实现程序设计者的企图,可以加花括弧来确定配对关系。例如:
If( )
{if( ) 语句1} (内嵌 if)
else 语句2
这时{ }限定了内嵌if语句的范围,因此else 与第一个ii配对。
例3有一函数:
y= -1 (x<0)
= 0 (x=0)
= 1 (x>0)
编一程序,输人一个x值,输出y值。
可以先写出算法:
输入x
若x<0 y=-1
若x=0 y=0
若x>0 y=1
输出y
或:
输入x
若x<0 y=-1
若x=0 y=0
若x>0 y=-1
输出y
有以下几个程序,请读者判断哪个是正确的?
程序1:
main()
{int x,y;
scanf("%d",&x);
if(x<0)y=-1;
else if(x==0)y=0;
else y=1;
printf("x=%d,y=%d\n",x,y);
}
程序2:将上面程序的if语句(第4~6行)改为:
if(x>=0)
if(x>0) y= 1;
else y=0;
else y=-1;
程序3:将上述if语句改为:
y=-1;
if (x!=0)
if(x>0) y=1;
else y=0:
程序4:
y=0;
if(x>=0)
if(x>0)y-1;
else y=-1;
只有程序1和程序2是正确的。程序中if和else是配对关系。例如程序3中的else 子句是和它上一行的内嵌的可语句配对,而不与第2行的if语句配对。为了使辑关系清晰,避免出错,一般把内嵌的if语句放在外层的else子句中(如程程1那样),这样由于有外层的else相隔,内嵌的else不会被误认为和外层的if配对,而只能与内嵌的if配对,样就不会搞混,如像程序3和程序4那样写就很容易出错。
三、条件运算符
若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如,若有以下if语句:
if(a>b)max=a;
else max=b;
可以用下面的条件运算符来处理:
max=(a>b)? a:b;
其中“(a>b)?a:b”是一个“条件表达式”。它是这样执行的:如果(a>b)条件为真,则条件表达式取值a,否则取值b。
条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。条件表达式的一般形式为
表达式1?表达式2:表达式3
说明:
(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式
3的值就是整个条件表达式的值。
max=(a>b)? a:b
执行结果就是将条件表达式的值赋给max。也就是将a和b二者中大者赋给max。
(2)条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。
条件运算符的优先级别比关系运算符和算术运算符都低。因此
max=(a>b)? a : b
括号可以不要,可写成
max=a>b?a:b
如果有
a>b? a:b+1
相当于a>b?a:(b+1),而不相当于(a>b?a:b)+1。
- 条件运算符的结合方向为“自右至左”。如果有以下条件表达式:
- b? a:c>d? c:d
相当于
a>b?a :(c>d? c:d)
如果a=1,b=2,c=3,d=4,则条件表达式的值等于4。
(4)条件表达式还可以写成以下形式: a>b?(a=100);(b=100)
或
a>b? printf("%d",a);printf ("%d",b)
即“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。上面第二个条件表达式相当于以下 if-else 语句:
if(a>b) printf ("%d",a);
Else printf("%d",b);
- 条件表达式中表达式1的类型可以与表达式2和表达式3的类型不同。如
x?’a’: ‘b’
x是整型变量,若x等于0,则条件表达式的值为'b。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如
x>y?1:1.5
如果x<=y则条件表达式的值为1.5,若x>y,值应为1,由于1.5是实型,比整型高),因此,将1转换成实型值1.0。
例4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。
main()
{char ch;
scanf(“%c”,& ch);
ch=(ch>='A' && ch<='Z')?(ch+32):ch;
printf("%c\n",ch);}
运行结果如下:
A
a
条件表达式中的(ch+32),其中32是小写字母和大写字母ASCII码的差值。