第七章 运算符
7.1 运算符基础
7.1.1 什么是运算符
运算符是一种特殊的符号,用以用于数据的运算、赋值和比较等。
7.1.2 表达式
表达式指的是一组运算数、运算符的组合,表达式一定具有值,一个变量或一个常量就
是一个表达式,变量、常量与运算符也可以组成复杂一些的表达式。
7.1.3 运算符分类
(1)按照操作数个数分类:
一元运算符(一目运算符)
二元运算符(二目运算符)
三元运算符(三目运算符)
(2)按照功能分类:
算术运算符
赋值运算符 关系运算符 逻辑运算符
位运算符
7.1.4如何掌握运算符
掌握一个运算符,关注以下几个方面:
(1)运算符的含义。
(2)运算符操作数的个数。
(3)运算符所组成的表达式值。
(4)运算符有无副作用,副作用指运算后是否会修改操作数的值。
7.2 算数运算符
算术运算符是对数值类型的变量进行运算的,在 C 程序中使用的非常多。
![]()

(1)正好和符号
#include<stdio.h>
int main()
{
int x = 12;
int x1 = -x,x2 = +x;
int y = -67;
int y1 = -y, y2 = +y;
printf("x1=%d,x2=%d\n", x1, x2);
printf("y1=%d,y2=%d\n", y1, y2);
return 0;
}
x1=-12,x2=12
y1=67,y2=-67D:\c-code\Project2\x64\Debug\3-15.exe (进程 27276)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. .
(2)加,减,乘,除
#include<stdio.h>
int main()
{
int a = 5 + 2.5;
printf("%d\n", a*a);
double b = 6 / 4;
printf("%f\n", b);
double c = 6.0 / 4;
printf("%f\n", c);
return 0;
}
49
1.000000
1.500000D:\c-code\3-15\x64\Debug\3-15.exe (进程 22056)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
注意:整数之间做除法时,结果只保留整数部分而舍弃小数部分。
(3)取余
#include<stdio.h>
int main()
{
int res1 = 10 % 3;
printf("%d\n", res1);
int res2 = -10 % 3;
printf("%d\n", res2);
int res3 = 10 % -3;
printf("%d\n", res3);
int res4 = -10 % -3;
printf("%d\n", res4);
return 0;
}
1
-1
1
-1D:\c-code\3-15\x64\Debug\3-15.exe (进程 28764)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
注意:运算结果的符号与被模数也就是第一个操作数相同。
)自增和自减
(1)自增、自减运算符可以写在操作数的前面也可以写在操作数后面,不论前面还是
后面,对操作数的副作用是一致的。
(2)自增、自减运算符在前在后,对于表达式的值是不同的。 如果运算符在前,表达
式的值是操作数自增、自减之后的值;如果运算符在后,表达式的值是操作数自增、自减之前的值。
#include<stdio.h>
int main()
{
int i1 = 10, i2 = 20;
int i = i1++;
printf("%d\n", i);//10
printf("%d\n", i1);//11
i = ++i1;
printf("%d\n", i);//12
printf("%d\n", i1);//12
i = i2--;
printf("%d\n", i); //20
printf("%d\n", i2);//19
i = --i2;
printf("%d\n", i);//18
printf("%d\n", i2);//18
return 0;
10
11
12
12
20
19
18
18D:\c-code\3-15\x64\Debug\3-15.exe (进程 28676)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.3 关系运算符(比较运算符)

演示案例:
#include<stdio.h>
int main()
{
int a = 8;
int b = 7;
printf("a>b的值:%d\n", a > b);
printf("a>=b的值:%d\n", a >= b);
printf("a<b的值:%d\n", a < b);
printf("a<=b的值:%d\n", a <= b);
printf("a==b的值:%d\n", a == b);
printf("a!=b的值:%d\n", a != b);
return 0;
}
a>b的值:1
a>=b的值:1
a<b的值:0
a<=b的值:0
a==b的值:0
a!=b的值:1D:\c-code\3-15\x64\Debug\3-15.exe (进程 19452)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.4 逻辑运算符

(1)逻辑与&&
1)如果两个操作数都为真(非零),那么表达式的值为真,否则为假。
2)如果第一个操作数为假,第二个操作数没有计算的必要了,这种现象称为短路现
象。
#include<stdio.h>
int main()
{
double score = 70;//成绩
if (score >= 60 && score <= 80)
{
printf("ok1");
}
else
{
printf("ok");
}
int a = 10, b = 99;
if (a < 2 && ++b>99)
{
printf("ok100");
}
else
{
printf("b=%d", b);
}
return 0;
}
ok1b=99
D:\c-code\3-15\x64\Debug\3-15.exe (进程 21392)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(2)逻辑或||
1)只要有一个操作数为真,表达式的值就为真;两个操作数都为假,表达式的值为
假。
(2)如果第一个操作数为真,第二个操作数没有计算的必要了,这种现象称为短路现象。
#include<stdio.h>
int main()
{
double score = 70;
if (score >= 70 || score <= 80)
{
printf("ok1\n");
}
else
{
printf("ok2\n");
}
int a = 10,b = 99;
if (a > 5 || b++ > 100)
{
printf("ok100\n");
}
printf("b=%d\n", b);
return 0;
}
ok1
ok100
b=99D:\c-code\3-15\x64\Debug\3-15.exe (进程 36896)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.5 赋值运算符


注意:
(1)赋值运算符的第一个操作数(左值)必须是变量的形式,第二个操作数可以是任何形式的表达式。
(2)赋值运算符的副作用针对第一个操作数。
#include<stdio.h>
int main()
{
int a = 10, b = 20, c = 30;
c += 3;//等同于c=c+3,33
c += b;//等同于c=c+b,53
a += 1.7;//等同于a=a+1.7,11
printf("a=%d b=%d c=%d", a, b, c);
return 0;
}
a=11 b=20 c=53
D:\c-code\3-15\x64\Debug\3-15.exe (进程 23956)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.6 位运算符

注意:操作数进行位运算的时候,以它的补码形式进行运算。
(1)按位与、按位或、按位异或
#include<stdio.h>
int main()
{
int a = 17;
int b = -12;
printf("a&b=%d\n", a & b);
printf("a|b=%d\n", a | b);
printf("a^b=%d\n", a ^ b);
}
a&b=16
a|b=-11
a^b=-27D:\c-code\3-15\x64\Debug\3-15.exe (进程 10716)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

(2)按位取反
#include<stdio.h>
int main()
{
int a = 17;
int b = -12;
printf("~a=%d\n", ~a);
printf("~b=%d\n", ~b);
return 0;
}
~a=-18
~b=11D:\c-code\3-15\x64\Debug\3-15.exe (进程 8204)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

(3)按位左移,按位右移
lude<stdio.h>
int main()
{
int a = 17;
int b = -12;
printf("a<<2=%d\n", a << 2);
printf("b<<2=%d\n", b << 2);
printf("a>>3=%d\n", a >>3);
printf("b>>3=%d\n", b >>3);
return 0;
}
a<<2=68
b<<2=-48a>>3=2
b>>3=-2
D:\c-code\3-15\x64\Debug\3-15.exe (进程 10508)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

7.7 三元运算符
(1)基本语法
条件表达式? 表达式 1: 表达式 2;
(2)表达式最终取值
1)如果条件表达式为非 0(真),整个表达式的值是表达式 1;
2)如果条件表达式为 0(假),整个表达式的值是表达式 2;
#include<stdio.h>
int main()
{
int a = 10;
int b = 99;
int res = a > b ? a++ : b--;
int n1 = a > b ? 1.1 : 1.2;
printf("a=%d\n", a);
printf("b=%d\n", b);
printf("res=%d\n", res);
return 0;
}
a=10
b=98
res=99D:\c-code\3-15\x64\Debug\3-15.exe (进程 29892)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(4)课堂案例1:计算两个数的最大值(a,b)
#include<stdio.h>
int main()
{
int a = 10;
int b = 100;
int max = a > b ? a : b;
printf("a和b中的最大值是:%d", max);
return 0;
}
a和b中的最大值是:100
D:\c-code\3-15\x64\Debug\3-15.exe (进程 10456)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(5)课堂案例2:计算三个数的最大值
#include<stdio.h>
int main()
{
int a = 10;
int b = 100;
int c = 199;
//int max1 = a > b ? a : b;
//int max2 = max1 > c ? max : c;
int max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
printf("a,b,c中的最大值是:%d", max);
return 0;
a,b,c中的最大值是:199
D:\c-code\3-15\x64\Debug\3-15.exe (进程 37460)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.8 运算符优先级


运算符优先级总结:
(1)不要过多的依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量
使用小括号来控制表达式的执行顺序。
(2)不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来成。
(3)运算符优先级不用刻意地去记忆,总体上:一元运算符 > 算术运算符 > 关系运
算符 > 逻辑运算符 > 三元运算符 > 赋值运算符。
第八章 程序控制语句
在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的。
主要有三大流程控制语句:
(1)顺序控制 (2)分支控制 (3)循环控制
8.1 顺序控制语句
程序从上到下逐行地执行,表达式语句都是顺序执行的。并且上一行对某个变量的修改
对下一行会产生影响。

8.2 分支语句
8.2.1 单向分支
(1)基本语法
if (条件表达式)
{
执行代码块
}
说明:当条件表达式为真(非 0 时,就会执行代码块语句,条件表达式为假(0)时,不会执行代码块。
(2)单向分支流程图

(3)案例:
//编写一个程序,输入年龄,如果是未成年人,则提示“未成年人请在家长陪同下访问!”
#include<stdio.h>
int main()
{
int age = 0;
printf("please input your age::");
scanf("%d", &age);
if (age < 18)
{
printf("未成年人请在家长陪同下访问!");
}else
{
printf("welcome!");
}
return 0;
}
8.2.2 双向分支
(1)基本语句
if(条件表达式)
{
执行代码块1
}
else
{
执行代码块2
}
说明:当条件表达式成立(为真),执行代码块 1,否则执行代码块 2。
(2)双向分支流程图

(3)案例:
//输入年龄,如果年龄大于18,则输出“你的年龄大于18,要对自己的行为负责!”。否则输出“你的年龄不大,这次放过你。'
#include<stdio.h>
int main()
{
int age = 0;
printf("please input your age:\n");
scanf("%d", &age);
if (age > 18)
{
printf("你的年龄大于18,要对自己的行为负责");
}
else
{
printf("你的年龄不大,这次放过你");
}
return 0;
8.2.3 多向分支 else if
(1)基本语句
if(条件表达式1)
{
执行代码块1;
}
else if(条件表达式2)
{
执行代码块2;
}
...
else
{
执行代码块n;
}
说明:当条件表达式 1 成立时,即执行代码块 1,如果表达式 1 不成立,才去判断表达
式 2 是否成立,如果表达式 2 成立,就执行代码块 2,以此类推如果所有的表达式都不成立,
则执行 else 的代码块。
(2)流程图
(3)案例:张三参加考试,他和父亲达成协议,如果成绩不到 60 分没有任何奖励;如果成绩 60
分(含)到 80 分,奖励一个肉夹馍;如果成绩 80 分(含)到 90 分,奖励一个 ipad;如果
成绩 90 分及以上,奖励一部华为 mate60 pro。
#include<stdio.h>
int main()
{
//定义变量记录成绩
double score;
printf("please input your score:\n");
scanf_s("%lf", &score);
//根据成绩进行判定
if (score < 60)
{
printf("你的成绩不合格,没有奖励。\n");
}
else if (score<80)
{
printf("奖励你一个肉夹馍。\n");
}
else if (score < 90)
{
printf("奖励你一个ipad.\n");
}
else if (score >= 90)
{
printf("奖励你一部华为手机。\n");
}
else
{
printf("输入无效。\n");
}
return 0;
}
8.2.4 多向分支switch
(1)基本语句
switch(表达式)
{
case 常量值 1;
语块1;
break;
case 常量值 2;
语块2;
break;
...
case 常量值 n;
语块n;
break;
default;
语句块n+1;
}
说明:
(1)switch 后面表达式的值必须是一个整型(char、short, int, long 等)或枚举类型。
(2)case 后面的值必须是常量,而不能是变量。
(3)default 是可选的,当没有匹配的 case 时,执行 default。
(4)break 语句可以使程序跳出 switch 语句块,如果没有 break,会执行下一个 case 语
句块,直到遇到 break 或者执行到 switch 结尾,这个现象称为穿透。
(2)流程图

案例:
编写一个程序,该程序可以接收一个字符,比如:a、b、c、d 其中 a 表示星期一,b 表
示星期二…,根据用户的输入显示相应的信息,要求使用 switch 语句。
流程分析:

#include<stdio.h>
int main()
{
char c;
printf("please input noe chare(a,b,c,d):");
scanf_s("%c", &c);
switch (c)
{
case 'a':
printf("今天星期一,猴子穿新衣");
break;
case 'b':
printf("今天星期二,猴子当小二");
break;
case 'c':
printf("今天星期三,猴子爬雪山");
break;
case 'd':
printf("今天星期四,猴子有急事");
break;
default:
printf("没有匹配到任何值~");
}
printf("switch结束");
return 0;
}
(4)案例:
编写程序,输入月份,输出该月份有多少天。说明:1 月、3 月、5 月、7 月、8 月、10
月、12 月有 31 天,4 月、6 月、9 月、11 月有 30 天,2 月有 28 天或 29 天。
/*编写程序,输入月份,输出该月份有多少天。说明:1 月、3 月、5 月、7 月、8 月、10
月、12 月有 31 天,4 月、6 月、9 月、11 月有 30 天,2 月有 28 天或 29 天。*/
#include<stdio.h>
int main()
{
//定义变量记录月份
int month;
printf("please input month:");
scanf_s("%d", &month);
//进行switch判断
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("%d月有31天。\n",month);
break;
case 4:
case 6:
case 9:
case 11:
printf("%d月有30天。\n", month);
break;
case 2:
printf("%d月有28或者29天。\n", month);
default:
printf("请输入正确的月份数。\n");
}
return 0;
}
(5)switch与if else的比较
1)如果判断条件是判等,而且符合整型、枚举类型,虽然两个语句都可以使用,建议
使用 swtich 语句。
2)如果判断条件是区间判断,大小判断等,使用 if else if。
8.2.5 嵌套分支
(1)基本介绍
嵌套分支是指,在一个分支结构中又嵌套了另一个分支结构,里面的分支的结构称为内
层分支,外面的分支结构称为外层分支。嵌套分支层数不宜过多,建议最多不要超过 3 层。
(2)基本语法
if ()
{
if()
{
}
else
{
switch()
{
case ....
}
}
}
(3)应用案例
输入油号(92 或 95)和油量,计算需要支付的金额。92 号汽油每升 4 元,如果油量大
于等于 40 升,每升 3.5 元;95 号汽油每升 5 元,如果油量大于等于 40 升,每升 4.5 元。
流程分析:

/*输入油号(92 或 95)和油量,计算需要支付的金额。92 号汽油每升 4 元,如果油量大
于等于 40 升,每升 3.5 元;95 号汽油每升 5 元,如果油量大于等于 40 升,每升 4.5 元。
流程分析:*/
#include<stdio.h>
int main()
{
//获取用户输入的油号和油量
int oilN, oilL;
printf("请输入油号:");
scanf_s("%d", &oilN);
printf("请输入油量:");
scanf_s("%d", &oilL);
//定义价格
double price;
//嵌套分支
switch (oilN)
{
case 92:
price = 4;
if (oilL>=40)
{
price = 3.5;
}
printf("您本次加油%.2f元\n", price * oilL);
break;
case 95:
price = 5;
if (oilL>=40)
{
price = 4.5;
}
printf("您本次加油%.2f元\n", price * oilL);
break;
default:
printf("本加油站没此油号!");
}
return 0;
}
1379

被折叠的 条评论
为什么被折叠?



