条件运算符和条件表达式
条件运算符为“?和:”,它是一个三目运算符,即有三个参与运算的量。
由条件运算符组成条件表达式的一般形式为:
表达式1? 表达式2: 表达式3
其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。
条件表达式通常用于赋值语句之中。
例如条件语句:
if(a>b) max=a;
else max=b;
可用条件表达式写为
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>d?c:d
应理解为
a>b?a:(c>d?c:d)
这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。
【例5.8】
#include "stdio.h"
void main()
{
int a, b, max;
printf("\n input two numbers: ");
scanf("%d%d", &a, &b);
printf("max=%d", a>b ? a : b);
}
补充:输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。
#include <stdio.h>
void main()
{
char ch;
scanf("%c", &ch);
ch = (ch >= 'A'&& ch <= 'Z') ? (ch + 32) : ch;
printf("%c\n", ch);
}
switch语句
C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:
其语义是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
【例4.9】
#include <stdio.h>
void main()
{
int a;
printf("input integer number: ");
scanf("%d", &a);
switch (a)
{
case 1:printf("Monday\n");
case 2:printf("Tuesday\n");
case 3:printf("Wednesday\n");
case 4:printf("Thursday\n");
case 5:printf("Friday\n");
case 6:printf("Saturday\n");
case 7:printf("Sunday\n");
default:printf("error\n");
}
}
在上面的程序中,我们运行后输入4,会得到:
input integer number: 4
Thursday
Friday
Saturday
Sunday
error
为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。
请看后边例子……
【例4.10】
#include <stdio.h>
void main()
{
int a;
printf("input integer number: ");
scanf("%d", &a);
switch (a)
{
case 1:printf("Monday\n"); break;
case 2:printf("Tuesday\n"); break;
case 3:printf("Wednesday\n"); break;
case 4:printf("Thursday\n"); break;
case 5:printf("Friday\n"); break;
case 6:printf("Saturday\n"); break;
case 7:printf("Sunday\n"); break;
default:printf("error\n");
}
}
在使用switch语句时还应注意以下几点:
1) 在case后的各常量表达式的值不能相同,否则会出现错误。
2) 在case后,允许有多个语句,可以不用{}括起来。
3) 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4) default子句可以省略不用。
【例4.11】输入三个整数,输出最大数和最小数。
#include <stdio.h>
void main(){
int a, b, c, max, min;
printf("input three numbers: ");
scanf("%d%d%d", &a, &b, &c);
if (a>b)
{
max = a; min = b;
}
else
{
max = b; min = a;
}
if (max<c)
max = c;
else
if (min>c)
min = c;
printf("max=%d\nmin=%d", max, min);
}
【例4.12】计算器程序。用户输入运算数和四则运算符,输出计算结果。
#include "stdio.h"
void main()
{
double a, b;
char c;
printf("input");
scanf("%lf%c%lf", &a, &c, &b);
switch (c)
{
case '+':
printf("%lf\n", a + b);
break;
case '-':
printf("%lf\n", a - b);
break;
case '*':
printf("%lf\n", a * b);
break;
case '/':
printf("%lf\n", a / b);
break;
default:
printf("error");
}
}
作业:
1 输入一个年份,并判断是否为闰年?
#include <stdio.h>
void main(){
int a;
printf("input a year:");
scanf("%d", &a);
if (a >= 0)
{
if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
printf("%d is a run_nian\n", a);
else
printf("%d is not a run_nian\n", a);
}
else
printf("Error input!");
}
2.运输公司对用户计算运费。
路程(s)越远,每公里运费越低。标准如下:
s<250km 没有折扣
250≤s<500 2%折扣
500≤s<1000 5%折扣
1000≤s<2000 8%折扣
2000≤s<3000 10%折扣
3000≤s 15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,
折扣为d,则总运费f的计算公式为:
f=p*w*s*(1-d)
#include <stdio.h>
void main()
{
float p, w, s, d, f;
printf("input p,w,s:");
scanf("%f%f%f", &p, &w, &s);
if (s < 250)
d = 0;
else if (s >= 250 && s < 500)
d = 0.02;
else if (s >= 500 && s < 1000)
d = 0.05;
else if (s >= 1000 && s < 2000)
d = 0.08;
else if (s >= 2000 && s < 3000)
d = 0.1;
else
d = 0.15;
printf("total is %.2f", p*w*s*(1 - d));
}