条件运算符和条件表达式
条件运算符“?”和“:” 它是一个三目运算符,即有三个参与运算的量。
条件表达式的一般形式:表达式1?表达式2:表达式3
其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。
条件表达式通常用于赋值语句中
如:条件语句:
if(a>b) max=a;
可用条件表达式写为:
max=(a>b)?a:b;
执行该语句的语义是如果a>b为真,则把a赋予max,否则把b赋予给max。
使用条件表达式时应注意以下几点:
1.条件运算符的优先级低于关系运算符和算术运算符,但高于赋值运算符呢。
因此max=(a>b)?A:b可以去掉括号,写为max=a>b?A:b
2.条件运算符?和:是一对运算符,不能单独使用。
3.条件运算符的结合方向是自右向左
如:a>b?a:c?c:d
应该理解为:a>b?(c>d?c:d)
这也是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。
例1:
#include<stdio.h>
void main()
{
int a,b,max;
printf(“\n input two numbers:”);
scanf(“%d %d”,&a,&b);
printf(“max=%d\n”,a>b?a:b);
}
例2:输入一个字符,辨别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换,然后输出最后得到的字符。
#include<stdio.h>
{
char ch;
scanf(“%c”,&ch);
ch=(ch>=’A’&&ch<=’Z’)?(ch+32):ch;
printf(“%c\n”,ch);
}
switch语句
switch语句的一般形式为:
switch(表达式)
{
case 常量表达式:语句1;
case 常量表达式:语句2;
……
case 常量表达式:语句n;
default:语句n+1;
}
其语义是,计算表达式的值,并逐个与其后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有的case后的语句。如果表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
例1:
#include<stdio.h>
void main()
{
int a;
printf(“input a number:”);
scanf(“%d”,&a);
switch(a)
{
case1:printf(“Monday\n”);
case2:printf(“Tuseday\n”);
case3:printf(“Wednesday\n”);
case4:printf(“Thursday\n”);
case5:printf(“Friday\n”);
case6:printf(“Saturday\n”);
case7:printf(“Sunday\n”);
default:printf(“error\n”);
}
}
分析:为了避免上述情况,C语言还提供了一种break语句,用于跳出switch语句,break语句只有关键字break,没有参数。
例2:
#include<stdio.h>
void main()
{
int a;
printf(“input a number:”);
scanf(“%d”,&a);
switch(a)
{
case1:printf(“Monday\n”);break;
case2:printf(“Tuseday\n”);break;
case3:printf(“Wednesday\n”);break;
case4:printf(“Thursday\n”);break;
case5:printf(“Friday\n”);break;
case6:printf(“Saturday\n”);break;
case7:printf(“Sunday\n”);break;
default:printf(“error\n”);break;
}
}
在使用switch 语句时还应该注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。
2.在case后,允许有多个语句,可以不用()括起来;
3.各case和default子语的先后顺序可以变动,而不会影响程序执行结构。
4.default子句可以省略不用。
例3:计算器程序,用户输入运算数,和四则运算符,输出计算结构。
#include<stdio.h>
void main()
{
float a,b;
char c;
printf(“input expression:a+(-*%)b\n);
scanf(“%f%c%f”,&a,&c,&b);
switch(c)
{
case’+’:printf(“%f\n”,a+b);break;
case’-‘:printf(“%f\n”,a-b);break;
case’*’:printf(“%f\n”,a*b);break;
case’/’:printf(“%f\n”,a/b);break;
default:printf(“input error\n);break;
}
}