10天学会嵌入式技术之C语言-day-3

第七章 运算符

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=-67

D:\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.500000

D:\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
-1

D:\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
18

D:\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的值:1

D:\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=99

D:\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=-27

D:\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=11

D:\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=-48

a>>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=99

D:\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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值