2020.9.22 第四课 运算符表达式和语句

运算符类型

作用

算术运算符

用于处理四则运算

赋值运算符

用于将表达式的值赋给变量

比较运算符

用于表达式的比较,并返回一个真值或假值

逻辑运算符

用于根据表达式的值返回真值或假值

位运算符

用于处理数据的位运算

sizeof 运算符

用于求字节数长度

2.1算术运算符

1600854605540

1、进行四则混合运算时,运算顺序遵循数学中“先乘除后加减”的原则。

2、在进行自增(++)和自减(--)的运算时,

如果运算符(++或--)放在操作数的前面则是先进行自增或自减运算,再进行其他运算。

反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或自减运算。

请仔细阅读下面的代码块,思考运行的结果。

int num1 = 1; 

int num2 = 2; 

int res = num1 + num2++; 

printf("num2=%d" + num2); 

printf("res=%d" + res); 

上面的代码块运行结果为:num2=3,res=3,具体分析如下:

第一步:运算 mum1+mun2++的结果,此时变量 mun1,mum2 的值不变。

第二步:将第一步的运算结果赋值给变量 res,此时 res 值为 3。

第三步:mum2 进行自增,此时其值为 3。

3、在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有浮

点数参与运算,系统会将整数数据隐形类型转换为浮点类型,最终得到的结果会是一个浮点数。例如,

2510/1000 属于整数之间相除,会忽略小数部分,得到的结果是 2,而 2.5/10 的实际结果为 0.25。

请思考一下下面表达式的结果:

3500/1000*1000

结果为 3000。由于表达式的执行顺序是从左到右,所以先执行除法运算 3500/1000,得到结果为 3,

然后再乘以 1000,最终得到的结果自然就是 3000。

4、取模运算在程序设计中都有着广泛的应用,例如判断奇偶数的方法就是求一个数字除以 2 的余数是

1 还是 0。在进行取模运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的

符号无关。如:(-5)%3=-2,而 5%(-3)=2。

赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。表 2-12 列举了 C 语言中的赋值

运算符及其用法。

2.2赋值运算符

1600854578278

“=”的作用不是表示相等关系,而是赋值运算符,即将等号右侧的值赋给等号左侧的

变量。在赋值运算符的使用中,需要注意以下几个问题:

1、在 C 语言中可以通过一条赋值语句对多个变量进行赋值,具体示例如下:

int x, y, z;

x = y = z = 5; //为三个变量同时赋值

在上述代码中,一条赋值语句可以同时为变量 x、y、z 赋值,这是由于赋值运算符的结合性为“从右

向左”,即先将 5 赋值给变量 z,然后再把变量 z 的值赋值给变量 y,最后把变量 y 的值赋值变量 x,表达

式赋值完成。需要注意的是,下面的这种写法在 C 语言中是不可取的。

int x = y = z = 5;

//这样写是错误的

2、在表 2-12 中,除了“=”,其他的都是特殊的赋值运算符,接下来以“+=”为例,学习特殊赋值运算符的

用法,示例代码如下:

int x=2;

x+=3;

上述代码中,执行代码 x += 3 后,x 的值为 5。这是因为在表达式 x+=3 中的执行过程为:

(1)将 x 的值和 3 的执行相加。

(2)将相加的结果赋值给变量 x。

所以,表达式 x=+3 就相当于 x = x + 3,先进行相加运算,在进行赋值。-=、*=、/=、%=赋值运算符

都可依此类推。

2.3比较运算符

比较运算符用于对两个数值或变量进行比较,其结果是一个逻辑值(“真”或“假”),如“5>3”,其值为

“真”。

C 语言的比较运算中,“真”用数字“1”来表示,“假”用数字“0”来表示。

1600854794297

需要注意的是,在使用比较运算符时,不能将比较运算符“==”误写成赋值运算符“=”。

	/*# 考试成绩小案例
	//考试:就是大于等于60 就是及格  小于60分就是不及格
	//一些其他的评判标准 
			判断				激励制
	A优秀		90分以上			500
	B良好		75分以上			200
	C及格		60分以上			作业本
	D不及格		45-60不及格			糖果
	E差			45分以下差			竹笋炒肉
	
	int Score;//学分

	scanf("%d", &Score);//从键盘获取一个数据存储到Score

	//45-60 两者之间:逻辑运算符:比较运算符  Score>45&&Score<60
	if (Score >=45 && Score < 60){
		printf("YES!!!
");
	}
	else {
		printf("NO!!!
");
	}


	如果 if     否则 else

		if (Score >= 60){//代码块
			printf("恭喜过关!!!
");
		}
		else {
			printf("开启地狱关卡!!!
");
	}

2.5逻辑运算符

逻辑运算符用于判断数据的真假,其结果仍为“真”或“假”。

1600854875003

当使用逻辑运算符时,有一些细节需要注意,具体如下:

1、逻辑表达式中可以包含多个逻辑运算符,例如,!a||a>b

2、三种逻辑运算符的优先级从高到低依次为:!、&&、||

3、运算符“&&”表示与操作,当且仅当运算符两边的表达式结果都为真时,其结果才为真,否则结果

为假。如果左边为假,那么右边表达式是不会进行运算的,具体示例如下:

a+b<c&&c==d

若 a=5,b=4,c=3,d=3,由于 a+b 的结果大于 c,表达式 a+b<c 的结果为假,因此,右边表达式 c==d

不会进行运算,表达式 a+b<c&&c==d 的结果为假。

4、运算符“||”表示或操作,当且仅当运算符两边的表达式结果都为假时,其结果为假。同“&&”运算

符类似,如果运算符“||”左边操作数的结果为真,右边表达式是不会进行运算的,具体示例如下:

a+b<c||c==d

若 a=1,b=2,c=4,d=5,由于 a+b 的结果小于 c,表达式 a+b<c 的结果为真,因此,右边表达式 c==d

不会进行运算,表达式 a+b<c||c==d 的结果为真。

2.6位运算符

位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字 0 和 1 进行操作的。

1600855010296

接下来通过一些具体示例,对表 2-15 中描述的位运算符进行详细介绍,为了方便描述,下面的运算都

是针对 byte 类型的数,也就是 1 个字节大小的数。

1、 与运算符“&”是将参与运算的两个二进制数进行“与”运算,如果两个二进制位都为 1,则该位的

运算结果为 1,否则为 0。

例如将 6 和 11 进行与运算, 6 对应的二进制数为 00000110,11 对应的二进制数为 00001011,具

体演算过程如下所示:

0000 0110

&

0000 1011

—————————

0000 0010

运算结果为 00000010,对应数值 2。

2、 位运算符“|”是将参与运算的两个二进制数进行“或”运算,如果二进制位上有一个值为 1,则该

位的运行结果为 1,否则为 0。具体示例如下:

例如将 6 与 11 进行或运算,具体演算过程如下:

0000 0110

|

0000 1011

—————————

0000 1111

运算结果为 00001111,对应数值 15。

3、 位运算符“~”只针对一个操作数进行操作,如果二进制位是 0,则取反值为 1;如果是 1,则取

反值为 0。

例1 如将 6 进行取反运算,具体演算过程如下:

~ 0000 0110

—————————

​ 1111 1001

运算结果为 1111 1001(补码)

​ 1000 0110 (反码)

{负数第一位为符号位}(负数原码等于补码取反+1)

​ 所以 1000 0111(原码)

,对应数值-7。

例2 如将 -6 进行取反运算,具体演算过程如下:

~ 1000 0110 (原码)

1111 1001(反码)

1111 1010(补码)

—————————

​ 0000 0101(补码)

{正数原反补一致}

所以为 0000 0101(原码)

对应数值 5

4、 位运算符“^”是将参与运算的两个二进制数进行“异或”运算,如果二进制位相同,则值为 0,否

则为 1。

例如将 6 与 11 进行异或运算,具体演算过程如下:

00000110

^

00001011

—————————

00001101

运算结果为 00001101,对应数值 13。

5、 位运算符“<<”就是将操作数所有二进制位向左移动一位。运算时,右边的空位补 0。左边移走

的部分舍去。

例如一个 byte 类型的数字 11 用二进制表示为 00001011,将它左移一位,具体演算过程如下:

00001011 <<1

—————————

00010110

运算结果为 00010110,对应数值 22。

6、 位运算符“>>”就是将操作数所有二进制位向右移动一位。运算时,左边的空位根据原数的符号

位补 0 或者 1(原来是负数就补 1,是正数就补 0)。

例如一个 byte 的数字 11 用二进制表示为 00001011,将它右移一位,具体演算过程如下:

00001011 >>1

—————————

00000101

运算结果为 00000101,对应数值 5。

2.7sizeof(数据类型名称);

1600855929949

1600855951415

不同数据类型在内存中所占字节数都打印了出来,由此可见,使用 sizeof 关键

字可以很方便地获取到数据或数据类型在内存中所占的字节数。

优先级

运算符

在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,我们把这

种顺序称作运算符的优先级。表 2-16 列出了 C 语言中运算符的优先级,数字越小优先级越高。

表2-16 运算符优先级

1600856030506

1600856063540

多学一招:单目、双目、三目运算符

在 C 语言中根据运算符进行运算需根据变量的个数可以将运算符分为单目运算符、双目运算符和三目

运算符,

1600856132382

在表 2-17 中单目运算符的优先级高于双目运算符和三目运算符。三目运算符“?:”用于条件判断的情况,

三目运算符 和if else 表达形式不一样

//最早的if与else

	printf("请输入你考试的分数:
");
	scanf("%d", &Score);//从键盘获取一个数据存储Score

	//轻量级的逻辑判断就可以用
	Score >= 60 ? (printf("YES!!!
") ):(printf("NO!!!
"));

	//(第一段是判断条件) ? (判断正确:结果1) : (判断错误:结果2)

		//if (Score >= 60){
		//	printf("YES!!!
");
		//}
		//else{
		//	printf("NO!!!
");
		//}
原文地址:https://www.cnblogs.com/heerha/p/13720153.html