运算符 | 名称 | 描述 |
---|---|---|
== | 等于 | 检查两个操作数的值是否相等,如果相等则条件为真。 |
!= | 不等于 | 检查两个操作数的值是否相等,如果不相等则条件为真。 |
> | 大于 | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 |
< | 小于 | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 |
>= | 大于等于 | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 |
<= | 小于等于 | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 |
注:C语言里没有布尔值,用1表示真,0表示假
运算符 | 名称 | 描述 |
---|---|---|
&& | 与 | 如果两个操作数都为真(非零),则条件为真。 |
|| | 或 | 如果两个操作数中有任意一个为真,则条件为真。 |
! | 非 | 用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
已学运算符的优先级:
() |
---|
! |
* / % |
+ - |
> >= < <= |
== != |
&& |
|| |
= |
练习:
设a=3,b=4,c=5,写出下面各逻辑表达式的值。
a+b>c && b==c
!(a>b) && !c || 1
!(a+b) + c –1 && b + c/2
注意:
- if(条件表达式)后面不能有分号;
- else后面不能写条件;
示例:
1)用户输入一个整数,判断奇偶性并输出。
#include<stdio.h>
int main(){
int a;
printf("请输入一个整数:");
scanf("%d",&a);
if(a%2==0)
printf("是偶数!\n");
else
printf("是奇数!\n");
}
以下程序尝试着去完成:
2)用户输入一个字母,判断大小写并输出。
3)用户输入x的值 ,按下式计算并输出y的值!
双分支变形而来,没有B部分操作。
格式(没有else部分)
if(条件表达式)
? A部分
示例: 用户输入一个字母,如果是大写字母,就转换成小写字母。 否则,不转换。
int main(){
char ch;
printf("请输入一个字母:");
scanf("%c",&ch);
if(ch>='A' && ch<='Z') //条件也可写成 ch>=65 && ch<=90
ch=ch+32;
printf("ch=%c\n",ch);
}
注意: A部分与B部分必须是一个语句:
1、可以是一个简单语句;
2、也可以是由花括号括起来的多个简单语句(称为复合语句);
如:输入两个整数a和b,使a中存放两个数中的最小值,b中存放两个中的最大值,并输出a与b;
#include<stdio.h> int main(){ int a,b,c; printf("请输入a与b:"); scanf("%d%d",&a,&b); if(a<b){ c=a; a=b; b=c; } //这是一个复合语句,要注意花括号,可看成一个语句。 printf("a=%d,b=%d\n",a,b); }
标准结构里的A部分或B部分又可以是一个分支语句,这称为if语句的嵌套。
案例: 输入一个学生成绩s(百分制),给出优秀(s>=85),合格(60 ≤ s < 85),和不合格(s<60)三个等级的评价
方法一(嵌套在A部分):
#include<stdio.h>
int main(){
int s;
printf("请输入一个成绩:");
scanf("%d",&s);
//方法一:嵌套在if子句
if(s>=60)
if(s>=85)
printf("优秀!\n");
else
printf("合格!\n");
else
printf("不合格!\n");
}
方法二 (嵌套在B部分):
#include<stdio.h>
int main(){
int s;
printf("请输入一个成绩:");
scanf("%d",&s);
//方法二:嵌套在else子句
if(s>=85)
printf("优秀!\n");
else
if(s>=60)
printf("合格!\n");
else
printf("不合格!\n");
}
嵌套都发生在else子句时,可以整理语法格式为:
if(条件1)
语句1;
else if(条件2)
语句2;
else if(条件3)
语句3;
…
else if(条件n)
语句n;
else
语句n+1;
不少教材将其称为多分支语句,其实质上还是if语句的嵌套,只是语法写的整齐点。
例如: 上一个案例的方法二,分支语句可整理格式为:
if(s>=85)
printf("优秀!\n");
else if(s>=60)
printf("合格!\n");
else
printf("不合格!\n");
练习:
1、用户输入一百分制成绩s,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’。
#include<stdio.h>
//采用if-else if语句就比较简单(流程图略)
int main(){
int s;
printf("请输入一个成绩:");
scanf("%d",&s);
if(s>=90)
printf("A\n");
else if(s>=80)
printf("B\n");
else if(s>=70)
printf("C\n");
else if(s>=60)
printf("D\n");
else
printf("E\n");
}
如果考虑到效率问题(成绩在60~80之间的人数最多),按如下流程图设计算法,请尝试写出程序。
2、编程实现:运输公司对用户计算运输费用。依据不同路程(km)对每吨·千米运费有一定的折扣。折扣标准如下:
s < 250 没有折扣
250≤s < 500 2%折扣
500≤s < 1000 5%折扣
1000≤s < 2000 8%折扣
2000≤s < 3000 10%折扣
3000≤s 15%折扣
输入相应路程、重量与每吨每千米运费,计算用户所需缴纳运输费用并输出。
格式:
表达式1?表达式2:表达式3
运算规则与表达式的值: 先计算表达式1的值,如果表达式1值为真(非0),则计算表达式2的值,并作为整个表达式的值;若表达式1的值为假(0),则计算表达式3的值,并作为整个表达式的值。
如:
int a=6,b=3;
a>b?a:b //该表达式的值为6
a<b?a:b //该表达式的值为3
优先级: 仅比逗号运算符与赋值运算符高。
常见用法:
1)依据不同情况进行不同操作;
例: 输入一个数字来判断它是否为奇数或偶数 。
#include<stdio.h>
int main(){
int num;
printf("输入一个数字 : ");
scanf("%d",&num);
(num%2==0)?printf("偶数"):printf("奇数");
}
例: 用户输入一个字母,如果是大写字母,就转换成小写字母。 否则,不转换。
#include<stdio.h>
int main(){
char ch;
printf("输入一个英文字母 : ");
scanf("%c",&ch);
ch = ch>='A'&&ch<='Z'?ch+32:ch;
printf("ch=%c\n",ch);
}
2)两个值中取一个值;
例: 取两个值中的最大值;
#include<stdio.h>
int main(){
int a,b,max;
printf("输入a与b:");
scanf("%d%d",&a,&b);
max = a>b?a:b; //条件运算符的优先级比赋值运算符要高,所以这里的操作是:取a,b中的最大值赋值给max
printf("最大值为:%d\n",max);
}
switch(表达式)
{
case 常量表达式1:语句1;
break; /* 可选的 */
case 常量表达式2:语句2;
break; /* 可选的 */
...
default:语句n+1;
}
规则: 先计算表达式的值,再逐个和 case 后的常量表达式比较,若不等则继续往下比较,若一直不等,则执行 default 后的语句;若等于某一个常量表达式,则从这个表达式后的语句开始执行,并执行后面所有 case 后的语句。
要求:
例1: 依据用户输入的数值,判断是星期几。
#include <stdio.h>
int main()
{
int a;
printf("input integer number(1-7): ");
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");
}
}
例2: 用switch语句实现,用户输入一百分制成绩s,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’。
#include<stdio.h>
int main(){
int s;
printf("请输入一个成绩:");
scanf("%d",&s);
switch(s/10){ // 通过s/10将数据离散化
/* 利用:“如果 case 语句不包含 **break**,控制流将会 *继续* 后续的 case,直到遇到 break 为止。”的特性,可使得多个case共用一组语句。*/
case 10:
case 9: printf("A\n");break;
case 8: printf("B\n");break;
case 7: printf("C\n");break;
case 6: printf("D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: printf("E\n");break;
}
}