选择结构(分支结构)
1.关系运算符及其表达式
关系运算符:在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作,比较两个量的运算符就称为关系运算符
< <= >= > 优先级高
== != 优先级
优先级高低为: 算术运算符 > 关系运算符 > 赋值运算符
结合性 : 从左到右
a + b > c - d (a + b) > (c - d)
a > b > c
a != b == c
C 语言没有专用的逻辑值,0 表示假 非0 表示真
--------------------------------------------------------
2.逻辑运算符及其表达式
三种逻辑运算符
&&(AND) ||(OR) 双目运算符 从左算到由
!(NOT) 单目运算符 从又算到左
优先级
! > && > ||
! > 算术 > 关系 > && 和 || > 赋值
非0即为真
并不是所有的关系运算符都要算到最后
int a = 1, b = 2, c = 3, d = 4, m = -1, n = -1;
(m = a > b) && (n = c > d);
在&&当m=0时程序不会在执行,直接输出0;在||前当为非0时程序不会在执行,直接输出1;
m = ? n = ? 0 -1
--------------------------------------------------------
3.
if语句的三种形式
1) if
if(表达式)
语句
语义: 如果表达式的值为真,就执行其后的语句,否则,不执行
eg1:从键盘输入两个数,输出其中较大的那个
例程:
int main(int argc,char *argv[])
{
int a,b;
scanf("%d%d",&a,&b);//scanf 可以被空格,回车,Tab打断
if(a > b)
printf("max = %d\n",a);
if(a <= b)
printf("max = %d\n",b);
return 0;
}
2) if-else
if(表达式)
语句1
else
语句2
语义:如果表达式的值为真,就执行语句1,否则执行语句2
3) if-else-if
if(表达式1)
语句1
else if(表达式2)
语句2
……
else
语句n
语义:
eg2:根据输入的字符判断其是大写字母capital,小写字母lowercase,数字字符digit 还是其他字符 other 。
例程:
int main(int argc,char *argv[])
{
char ch = getchar();
if(ch >= 'A' && ch <= 'Z')
printf("this is capital\n");
else if(ch >= 'a' && ch <= 'z')
printf("this is lowercase\n");
else if(ch >= '0' && ch <= '9')
printf("this is digit\n");
else
printf("this is other\n");
return 0;
}
注意:使用if语句需要注意的问题
1) if关键后面的表达式通常是逻辑表达式或是关系表达式,但是也可以是其他表达式,如赋值表达式,甚至可以
是变量
if(a = 5) // if(5 == a) if(5 = a)
if(b) -> if(b != 0)
2) 如果在if语句后面要执行多条语句,那么请加上{}以复合语句的形式出现
eg3: 从键盘输入三个数,请按照从小到大的顺序进行输出。
int main(int argc,char *argv[])
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int tmp;
if(a > b)
{
tmp = a;
a = b;
b = tmp;
}
if(a > c)
{
tmp = a;
a = c;
c = tmp;
}
if(b > c)
{
tmp = b;
b = c;
c = tmp;
}
printf("%d <= %d <= %d\n",a,b,c);
return 0;
}
if语句的嵌套问题:
在嵌套内的if语句可能又是if-else 类型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和
else的配对问题。
else 总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对
--------------------------------------------------------
4.条件运算符及其表达式
条件运算符为 ? 和: 是一个三目运算符
一般形式为 expression1? expression2:expression3
语义:如果表达式1的值为真,就执行表达式2,否则执行表达式3
if(a > b)
max = a;
else
max = b;
max = (a > b? a:b)
a > b?(max=a):(max=b);
eg: 输入一个字符,判断它是不是大写字母,如果是,将其转换为小写,如果不是,直接输出
if(ch >= 'A' && ch <= 'Z')
ch = ch - 'A' + 'a'
else
ch = ch;
ch >= 'A' && ch <= 'Z'?ch = ch - 'A' + 'a':ch = ch;
ch = (ch >= 'A' && ch <= 'Z'?ch - 'A' + 'a':ch);
优先级:
关系 > 条件 > 赋值
结合性 从右至左
a > b ? a : c > d? c:d - > a > b ? a : (c > d? c:d)
--------------------------------------------------------
5.switch语句
注意:
1) 在case后面允许出现多条语句,可以不用{}括起来;
2) 在case 后面的各常量表达式(只能是常量或者常量表达式)必须互不相同,否则会出现出错;
3) 各case 和defaul 的顺序可以任意变动;
4) default 可以省略不写;
5) switch 后面的表达式的内容不能是浮点型,而只能是整型,字符型,枚举性
eg5: 先从键盘输入一个字符(+ - * / %),然后输入两个数字输出这两个数字和符号运算后的结果
int main(int argc,char *argv[])
{
char ch;
int a,b;
scanf("%d%d",&a,&b);
getchar();//吸收前面遗留在缓冲区里面的空格 或者 Tab 回车
scanf("%c",&ch);
printf("%d\n",ch);//打印的是ch的ASCII码
switch(ch)
{
case '+':
printf("%d + %d = %d\n",a,b,a+b);
break;
case '-':
printf("%d - %d = %d\n",a,b,a-b);
break;
case '/':
printf("%d / %d = %d\n",a,b,a/b);
break;
case '*':
printf("%d * %d = %d\n",a,b,a * b);
break;
case '%':
printf("%d %% %d = %d\n",a,b,a % b);
break;
default:
printf("input error\n");
}
return 0;
}