《C Primer Plus》学习总结--第五章

第五章 运算符、表达式和语句

常用运算符

C用运算符表示算数运算,基本算数运算符包括以下:
赋值运算符:=
加法运算符:+
减法运算符:-
符号运算符:-和+(表示数值的正负号)
乘法运算符:*
除法运算符:/
求模运算符:%
递增递减运算符:++、–
sizeof运算符和size_t类型
其中加法运算符、减法运算符和乘法运算符和日常数学计算用法相同,这里不再赘述。

赋值运算符

在C语言中,=不表示相等,表示赋值,将=右边的值赋给=左边。例如:int m = 1;在=左侧是一个变量名,右侧是赋给该变量的值,赋值行为从右往左进行。将1赋给m,此时m表示数值1。
在C语言中经常看到 m = m +1;表示变量i的值加上1重新赋值给m,此时m值更新变为2。
图片来源于C Primer Plus
在编写代码时需注意,在=号左侧必须是一个变量名。赋值表达式语句的目的是把值储存到内存位置上,右值指的是能赋值给可修改左值的量,右值可以是常量。变量或其他表达式。总结一句话就是:不可以把变量赋值给常量

除法运算符

在C语言中除法运算符和日常数学除法计算不是完全一样。在C语言中,整数除法和浮点数除法不同,浮点数除法的结果是浮点数,而整数除法的结果是整数。

#include<stdio.h>
int main(void)
{
	printf("integer division:5/4 is %d\n",5/4);//结果为1
	printf("integer division:6/3 is %d\n",6/3);//结果为2
	printf("float division:5.0/4.0 is %.2f\n",5.0/4.0);//结果为1.25
	printf("float division:5/4.0 is %.2f\n",5.0/4.0);//混合整数和浮点数相除结果为浮点数
	return 0;
}

整数除法会截断计算结果的小数部分,丢弃整个小数部分,表现整数部分。若混合整数和浮点数,计算机会在计算前,将整数转换为浮点数。

求模运算符

求模运算符用于整数运算,给出左侧整数除以右侧整数的余数。例如:5%4 = 1。求模运算在C语言程序编写中会经常用作条件判断。
在求模运算中,若运算符的左侧为负数,例如:-5%4 = -1
C语言规定: 如果第一个运算对象是负数,那么求模结果为负数;如果第一个运算对象是正数,那么求模结果也是正数。

递增运算符和递减运算符

递增运算符有两种表现形式:递增运算符出现在变量前称为前缀模式,出现在变量后称为后缀模式。如下:
++i 的意思是先将i+1赋值给i在用作运算,i++的意思是先使用当前i的值然后将i+1。

#include<stdio.h>
int main(void)
{
	int i = 0;
	int j = 0;
	printf("value of i is %d\n",i++);//value of i is 0
	printf("value of i is %d\n",i);//value of i is 1
	printf("value of j is %d\n",++j);//value of i is 1
	return 0;
}

图片来源于C Primer Plus
递减运算符用法与递增运算符相同,读者自行理解。

sizeof运算符和size_t类型

sizeof运算符以字节为单位返回运算对象的大小。复习以下sizeof的用法:如果sizeof的运算对象是类型,如sizeof (int),需要用括号括起来,若是变量名则不需要。
C语言规定,sizeof 返回size_t类型的值,其实就是一个unsigned int 类型。具体为typedef unsigned int size_t,使用tydedef机制为现用类型创建别名。

优先级和求值顺序

运算符优先级为表达式中求值提供重要的依据。类似于数学中先乘除后加减相关计算规则。图片来源于抖音
简单可记为:算数运算符>关系运算符>逻辑运算符>赋值运算符。

类型转换

在语句和表达式的类型转换中,都是从较小类型向较大类型转换,所以只要熟悉各类型的级别即可理解如何转换。在涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
类型的级别从高至低依次是:long double、double、float。unsigned long long、long long、unsigned long、long、unsigned int 、int。当在运算过程中出现赋值运算符时,最终将转换为赋值运算符的左侧类型。

#include<stdio.h>
int main(void)
{
	char ch;
	int i;
	float fl;
	fl = i = ch = 'C';
	printf("ch = %c,i = %d,fl = %.2f\n",ch,i,fl);
	ch = ch+1;
	i = fl+2*ch;
	fl = 2.0 * ch + i;
	printf("ch = %c,i = %d,fl = %.2f\n",ch,i,fl);
	return 0;
}

在这段代码中,fl = i = ch = ‘C’;赋值运算符从右往左进行,首先是字符’C’作为char类型储存在ch中,赋值给int类型i时,将会提高字符的级别,转换为整型对应67,fl为浮点数,所以将字符串对应的ASCII值转换为浮点数。所以第一行打印ch = ‘C’,i = 67,fl = 67.00;
在语句ch = ch+1;ch时char类型而数字1是int 类型,所以将ch提升为int类型为67,ch + 1变为67+1=68,赋值给ch,此时ch为char类型,所以将68转换成char类型为’D’。

强制类型转换

在C语言中,应当避免自动类型转换,在一些类型降级时可能会导致丢失精度问题,导致数据不准确。在某个量的前面放置圆括号括起来的类型名,该类型名即是希望转换成的目标类型,圆括号和他括起来的类型名构成了强制类型转换运算符,如想将float类型转换成int类型,操作如下:
A = (int)1.1+(int)2.2;此操作将1.1转换成整型,小数位舍弃,变为1。

写于2023.1.16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值