一、关系运算符和关系表达式
运算符 | 对应的数学运算符 | 含义 | 优先级 |
< > <= >= | < > ≤ ≥ | 小于 大于 小于等于 大于等于 | 高 |
== != | = ≠ | 等于 不等于 | 低 |
注意:
1.在书写关系运算符时,既不能在<=、>=、==、!=的符号之间插入空格,也不能将!=、<=、>=的符号写反,更不能与相应的数学运算符弄混。
2.不要将==误写为=。前者是相等关系运算符,后者赋值运算符。
关系运算符将两个操作数连接起来组成的表达式,称为关系表达式 。
关系表达式通常用于表达一个判断条件,而一个条件判断的结果只能有两种可能:真“非零”,假“0”
只要表达式的值为0,就表示表达式的值为假,即判断的条件不成立;而如果表达式的值为非零(也包括负数),则表示表达式的值为真,即判断条件成立。
例如:
“n不是偶数”可表示为下面的关系表达式:n%2!=0(它表示如果n被2求余结果不为0,即不能被2整除,则该关系表达式的值为真。换句话说就是,如果这个关系表达式的值为真,则表示n不是偶数,反之n不是偶数。)C语言中逻辑值表示形式的这种特殊性,使得C表达式书写形式得以简化。例如:将n%2!=0简化为n%2。
二、用于单分支控制的条件语句
结构:if(表达式P)语句A;
例题:使用单分支条件语句编程,计算并输出两个整数的最大值。
#include<stdio.h>
int main()
{
int a,b,max;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
if(a>=b)max=a;
if(a<b)max=b;
printf("%d\n",max);
return 0;
}
三、用于双分支控制的条件语句
一般形式:
if(表达式P)语句1
else 语句2
#include<stdio.h>
int main()
{
int a,b,max;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
if(a>=b)max=a;
else max=b;
printf("%d",max);
return 0;
}
四、条件运算符和条件表达式
条件运算符是C语言中唯一一个三元运算符,运算时需要三个操作数。
一般形式:表达式1?表达式2:表达式3
其含义是:若表达式1的值非0,则该表达式的值是表达式2的值,否则是表达式3的值。
#include<stdio.h>
int main()
{
int a,b,max;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
max=a>b?a:b;//用条件表达式计算两整数的最大值
printf("%d",max);
return 0;
}
五、用于多分支控制的条件语句
条件语句的第三种形式是else-if形式的条件语句,即:
if(表达式1)语句1
else if(表达式2) 语句2
...
else if(表达式m) 语句m
else语句 m+1
每条选择语句后面跟的语句如果是多条的话,就需要用花括号将语句括起来,才能保证程序逻辑上的正确性。
例题:从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax²+bx+c=0的根,当a=0时,输出“该方程不是一元二次方程”,当a≠0时,分b²-4ac与0的关系分三种情况,并输出方程的根。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define EPS 1e-6
int main()
{
float a,b,c,disc,p,q;
printf("Please input a,b,c:");
scanf("%lf%lf%lf",&a,&b,&c);
if(fabs(a)<=EPS)
{
printf("这不是一元二次方程\n");
exit(0);
}
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(fabs(disc))/(2*a);
if(fabs(disc)<=EPS)
{
printf("x1=x2=%.2f\n",p);
}
else
{
if(disc>EPS)
{
printf("x1=%.2f,x2=%.2f\n",p,q);
}
else
{
printf("x1=%.2f+%.2fi",p,q);
printf("x2=%.2f-%.2fi",p,q);
}
}
return 0;
}
exit()是C语言提供的标准库函数。exit()调用的一般形式为:
exit(code)
作用:终止整个程序的执行,强制返回操作系统,并将int型参数code的值传给调用进程(一般为操作系统)。
当code值为0或宏常量EXIT_SUCCESS时,表示程序正常退出;
当code值为非0或为宏常量EXIT_FAILURE时,表示程序出现某种错误后退出。
调用函数exit()还需要头文件<stdlib.h>。
六、用于多路选择的switch语句
当问题需要讨论的情况较多(一般大于三种)时,通常使用开关语句(也称为switch语句)代替条件语句来简化程序。
switch(表达式)
{
case 常量1:
可执行语句1
case 常量2:
可执行语句2
.
.
.
case 常量n:
可执行语句n
default:
可执行语句n+1
}
switch语句相当于一系列的if-else语句,被测试的表达式写在关键字switch后面的圆括号中,表达式只能是char类型或者int类型,这在一定程度上限制了switch语句的使用。
switch花括号中的关键字case后面接着的是常量,常量与case中间至少隔一个空格,常量后面是冒号,常量的类型应与switch后括号内表达式的类型一致。
运行过程:
首先计算switch后表达式的值,然后将该值依次与case后的常量值进行比较,当他们相等时,执行相应的case后面的代码段,代码执行完毕后,可使用break语句跳出switch语句。如果没有break语句,程序依次执行后面的语句,直到switch的右边花括号“}”为止。如果case语句后面的语句省略不写,则表示它与后续的case执行相同的语句。
例题:编程实现简单的计算器功能,要求用户按如下格式从键盘输入算式:
操作数1 运算符op 操作数2
计算并输出表达式的值,其中算术运算符包括:加'+' '-' '*' '/'。
#include<stdio.h>
int main(void)
{
int n1,n2;
char op;
float d;
printf("Please input number1 and number2:\n");
scanf("%d%c%d",&n1,&op,&n2);
switch (op)
{
case '+':
printf("%d+%d=%d\n",n1,n2,n1+n2);
break;
case '-':
printf("%d-%d=%d\n",n1,n2,n1-n2);
break;
case '*':
printf("%d*%d=%d\n",n1,n2,n1*n2);
break;
case '/':
if(n2==0)printf("error\n");
else
{
d=n1*1.0/n2;
printf("%d/%d=%f\n",n1,n2,d);
break;
}
default:
printf("Invalid operator!\n");
}
}
七、逻辑运算符和逻辑表达式
逻辑运算也称为布尔运算。逻辑运算的结果值同样只有真和假两个值,C语言规定1为真,0为假。但是在需要判断一个数值表达式(不一定是逻辑表达式)真假的时候,由于任意一个数值表达式的值不只局限于0和1,因此根据逻辑表达式的值为非0或0来判断其真假。
逻辑运算符 | 类型 | 含义 | 优先级 | 结合性 |
! && || | 单目 双目 双目 | 逻辑非 逻辑与 逻辑或 | 最高 较高 较低 | 从右向左 从左向右 从左向右 |
逻辑运算符的特点;
①逻辑与:仅当两个操作数都为真时,运算结果才为真;若有一个数为假,运算结果就为假。
②逻辑或:操作数只要有一个为真,运算结果才为真;仅当两个操作数都为假,运算结果才为假。
③逻辑非:若操作数的值为真,则其逻辑非运算的结果就为假。
优先级顺序 | 运算符种类 | 附加说明 | 结合方向 |
1 | 一元运算符 | 逻辑非! 相反数- ++ -- sizeof 类型强制转换等 | 右到左 |
2 | 算术运算符 | * / % 高于 +- | 左到右 |
3 | 关系运算符 | < <= > >= 高于 == != | 左到右 |
4 | 逻辑运算符 | 除逻辑非外,&&高于|| | 左到右 |
5 | 赋值运算符 | = += -= *= /= %= | 右到左 |
例题:编程输入三角形的三条边a,b,c,判断它们能否构成三角形,指出是何种三角形:
等腰、直角、等腰直角、一般三角形。
#include<stdio.h>
#include<math.h>
#define EPS 1e-1
int main()
{
float a,b,c;
printf("请输入三条边的长度:\n");
scanf("%f%f%f",&a,&b,&c);
int flag=1;//置标志变量flag为非0值
if(a+b>c&&b+c>a&&a+c>b)
{
if(fabs(a-b)==EPS||fabs(a-c)==EPS||fabs(c-b)==EPS){
printf("等腰");
flag=0;//置标志变量flag为0
}
if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b){
printf("直角");
flag=0;
}
if(flag)//若标志变量flag非0,则是一般三角形
{
printf("一般");
}
printf("三角形\n");
}else{
printf("不是三角形\n");
}
return 0;
}