前言

这部分东西不多,相对简单,快速上手,通俗易懂。

关系运算符和关系表达式

关系运算符

在程序中经常需要比较两个量的大小关系,以决定程序的下一步进行的工作。比较两个量的运算符称为关系运算符。通俗来讲,也就是比较运算,即将两个操作数比较并产生运算结构0(假)或1(真)。C语言提供的关系运算符有6种,例如:

运算符 功能
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
!= 不等于

说明:

  1. C语言中的关系运算符与数学中的(>,>=等)不一样。
  2. 以上6种关系运算符中,前4种(<,<=,>,>=)的优先级相同,后两种(==,!=)的优先级相同,前4种优先级高于后两种。
  3. 关系运算符的结合性为从左到右。

关系表达式

关系表达式是指用关系运算符将两个数(或者表达式)连接起来进行关系运算的式子,代码示例:

1
2
3
3<2;
a>b;
a<a+b;

关系表达式的结果是逻辑值,即真值或者假值,其中1为真,0为假,真值表示关系表达式表示关系成立,反之则不成立

优先级和结合性

关系运算符的结合性都是自左向右的。

注意运算符的优先级

逻辑运算符和逻辑表达式

C语言中,对参与逻辑运算的所以数值,都转化为逻辑“真”或“假”后才参与逻辑运算,如果参与逻辑运算的数值为0,则把它作为逻辑“假”处理,而所有非0的数值都作为逻辑“真”处理

逻辑运算符

C语言中有3种逻辑运算符:逻辑与(和)(&&),逻辑或(||),逻辑非(!),详细如下表:

运算符 功能
&& 与(和),双目运算符,左右两数为“真”则为真,反之为“假”
|| 或,双目运算符,左右都为“假”则为假,反之为“真”
非,单目运算符,对操作符取反

逻辑表达式

逻辑表达式是由逻辑运算符将逻辑量连接起来构成的式子。对象可以是任何类型的数据,但运算结果一定是整型值,并且只有两个值:1和0,分别表示真和假

说明:

  1. 对于a&&b,只有a的值为真时,才需要判断b的值。
  2. 对于a||b,只有a的值为真时,才不需要判断b的值。
  3. 对于$2<a<3$这类表达式,C语言中的实现为(a>2)&&(a<3)

优先级和结合性

三种运算符的优先级由高到低依次为:!&&||

逻辑运算符中的&&||的结合性为从左向右,!的结合性为从右向左。

【实例】逻辑运算符的应用

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){

int a, b;
a = 12;
b = 0;
printf("a与b的结果为 %d\n", a && b);
printf("a与b的结果为 %d\n", a || b);
printf("b取反的结果为 %d", !b);

return 0;
}

【输出结果】image-20220107202757950

if语句

if语句是条件选择语句,它先对给定条件进行判断,根据判定的结果(真或假)决定要执行的语句。if语句有if分支,if-else分支和嵌套的if语句3种形式

if分支

if分支是最简单的条件语句,if分支语句的一般形式如下:

1
2
if(表达式)
语句1;

其中,表达式一般为逻辑语句或者关系表达式。语句1可以是一条简单的居于或者多条语句,当为多条语句时,需要用大括号{},将这些语句括起来,构成复合语句
if分支语句的执行过程是:当表达式值为真(非0)时,会执行语句1,反之则不执行。

【实例】从键盘输入一个整数,如果输入的是2的倍数,则显示“成功”,反之则不显示
【代码示例】

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(){

int a;
scanf("%d", &a); //获取输入
if (a%2==0) //取余判断
printf("成功"); //输出
return 0;
}

【输出结果】image-20220107212112534

if-else分支

if分支语句只允许在条件为真时指定要执行的语句,而if-else分支还可以在条件为假时指定要执行的语句。if-else分支语句的一般形式如下:

1
2
3
4
if(表达式)
语句1;
else
语句2;

还是上面2的整数的例子,稍微改进一下,如果不是2的倍数,则输出“不是2的倍数”。代码示例:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(){

int a;
scanf("%d", &a); //获取输入
if (a%2==0) //取余判断
printf("%d是2的倍数",a);
else
printf("%d不是2的倍数", a);
return 0;
}

输出结果:image-20220107212335429

【实例】输入三个值,如果三个值均大于0且符合任意两个之和大于第三个,则计算以这三个值为边的三角形面的结果。
【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <math.h>
int main(){

int a, b, c; //定义三边长
double s; //定义面积
scanf("%d %d %d", &a, &b, &c);
if (a+b>c && a+c>b && b+c>a && a>0 && b>0 && c>0)
{
s = sqrt(( a + b + c )*(a + b - c)*(a + c - b)*(b + c - a))/4;
printf("三角形的面积为%f", s);
}else{
printf("出错啦");
}

return 0;
}

【输出结果】image-20220107214623210

已知三边,求三角形面积参考 海伦公式

嵌套的if语句

简单的if语句只能通过给定条件的判断执行两种操作,而不能多种操作中选择一个,此时嵌套的if语句解决了这个问题。**if语句中又包含一个或者多个if语句时,称为if语句的嵌套**。
常用的if语句嵌套有以下两种形式:

  • 形式一,代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(表达式)
    if(表达式)
    语句1;
    else
    语句2;
    else
    if(表达式)
    语句3;
    else
    语句4;
  • 形式二,代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(表达式1)
    语句1;
    else if(表达式2)
    语句2;
    else if(表达式3)
    语句3;
    else if(表达式n)
    语句n;
    else
    语句n+1;

    【实例】将学生成绩按分数输出 A B C D E 等级
    【补充】成绩对照关系表

    百分制 等级
    90$\leq$score$\leq$100 A
    80$\leq$score$<$90 B
    70$\leq$score$<$80 C
    60$\leq$score$<$70 D
    0$\leq$score$<$60 E

    【代码示例】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
    #include <math.h>
    int main(){
    int score; //定义分数
    printf("请输入分数:");
    scanf("%d", &score); //获取输入的分数
    if (score>100 || score <0)
    {
    printf("输入的成绩不合法");
    }else if (score <=100 && score>=90)
    {
    printf("该同学的成绩等级为 A");
    }else if (score <90 && score >=80){
    printf("该同学的成绩等级为 B");
    }else if (score <80 && score >=70)
    {
    printf("该同学的成绩等级为 C");
    }else if (score <70 && score >=60)
    {
    printf("该同学的成绩等级为 D");
    }else{
    printf("该同学的成绩等级为 E");
    }
    return 0;
    }

    【输出结果】image-20220107221041613

switch语句

对于常规的两种选择可以使用if-else语句,那么对于两种及以上的多种选择则需要switch语句的帮助了。当然你也可以通过使用嵌套的if-else语句来实现多种选择。

switch语句的一般格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
switch (表达式)
{
case 常量表达式1:
语句系列1;
break;
case 常量表达式2:
语句系列2;
break;
//default可以为空
default:
break;
}

【实例】在键盘上输入 17 实现输出对应的星期几,如果输入的值不是 17,则输出非法数据。

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
int main(){
int a;
printf("请输入数值:");
scanf("%d", &a);
switch (a)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;

default:
printf("输入的数据非法");
break;
}
}

【说明】

  1. break表示跳出当前循环。
  2. case的循序是任意的,也就是说default可以放到最前面或者任意一个位置。

条件运算符和条件表达式

条件运算符很特殊,它是C语言中唯一一个三目运算符,也就是说,它要求要有三个运算对象。条件表达式的一般形式如下:

1
表达式1 ? 表达式2 : 表达式3 ;

条件表达式的执行过程:如果表达式1的值为真,则执行表达式2,反之则执行表达式3。例如:

1
c=a>b?a:b;

若a大于b,则c的值由a赋值,反之,则c的值由b赋值。

比较两个数最大值可以使用该方法

说明:

  1. 条件运算符的优先级低于算术运算符,关系运算符以及逻辑运算符,仅高于赋值运算符和逗号运算符

  2. 条件运算符的结合性为从左到右,当有条件运算符镶嵌时,按照从右到左的顺序依次运算。

  3. 条件表达式中三个表达式的类型可以不同,其中表达式1表示条件,只能是0或者非0的结果;当表达式2和表达式3的类型不同时,条件表达式值的类型为两者中较高的类型(可以参考自动类型转换阶级)。例如:

    1
    2
    int a=1,b=2;
    a<b?3:4.0;

    该例子的值为 3.0 而不是整型数 3 。

应用实例

【实例】经典问题,对于输入的年份,计算该年份是否为闰年。

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main(){

int year;
printf("请输入年份:");
scanf("%d", &year);
if (year%4==0)
{
if (year%100 !=0)
{
printf("%d 为闰年", year);
}else{
if (year%400==0)
{
printf("%d 为闰年", year);
}else{
printf("%d 不是闰年", year);
}
}
}else{
printf("%d 不是闰年", year);
}

return 0;
}

【说明】闰年判断规则:

  1. 能被4整除且不能被100整除。
  2. 世纪年能被400整除的。