一、算术操作符:+ - * / %
全部属于双目操作符,两个操作数参与运算。
int a = 4 + 22; //加法 int b = 61 - 23; //减法 int c = 5 * 5; //乘法⚠️两个高频坑
- 除法
/:整数除法直接舍弃小数
如果两边都是整数,执行整除。6/4结果为1,不是 1.5。想要小数结果,至少一边写成浮点数6.0 /4。
float x = 6 / 4; // 输出1.000000,整数先做整除 float y = 6.0 /4; // 输出1.500000,浮点数除法实战坑:
(5/20)*100结果是 0,因为5/20整数整除得到 0;改成(5/20.0)*100才能得到预期结果。
- 取模
%:只允许整型操作数
用来求余数,结果正负号由第一个操作数决定。
printf("%d\n",11%-5); //1 printf("%d\n",-11%-5); //-1 printf("%d\n",-11%5); //-1小技巧:num%10可以拿到整数的最后一位数字。
二、赋值操作符
=是赋值,不是数学的等于;相等判断要用==。
int a = 100; //初始化,定义变量同时赋值 a = 200; //赋值,变量已经存在,重新修改值1. 连续赋值
int a=3,b=0,c=0; c = b = a+3; //从右往左运算不推荐写连续赋值,可读性差,调试不方便,建议拆开写:
b = a+3; c = b;2. 复合赋值符
简化代码,等价改写。常用:+= -= *= /= %=
int a =10; a +=3; //等价 a = a+3 a -=2; //等价 a = a-2注意左边必须是变量,不能是常量。
三、单目操作符:只有一个操作数
本次重点:++、--、正号+、负号-。
1. 自增 ++、自减 –
核心区分前置、后置:
- 前置
++a:口诀:先 + 1,后使用
int a=10; int b = ++a; //a先自增到11,再赋值给b;a=11,b=11- 后置
a++:口诀:先使用,后 + 1
int a=10; int b = a++; //先把a原始值10赋值b,a再自增;a=11,b=10--逻辑完全一样,只是操作变成减 1。
注意:
++/--只能用于变量,不能用于常量,(10)++直接报错。
2. 单目+、-
+正号,可省略;-负号,用来翻转数值正负。
int a = 10; int b = -a; //b=-10四、表达式求值
表达式 = 操作符 + 操作数组合,用来算出一个结果。表达式求值由优先级、结合性、类型转换共同决定。
4.1 优先级和结合性
- 优先级:优先级高先算。类似数学:括号 > 自增自减 > 乘除取模 > 加减 > 赋值。
3 +4*5,*优先级高,先算 4*5。记不全优先级就多加括号,括号优先级最高,提升可读性。
- 结合性:优先级相同时看结合方向
- 大部分双目运算符(
* / + -):左结合,从左往右算; - 赋值操作符:右结合,从右往左算。
4.2 类型转换
分为隐式(编译器自动做)、显式强制转换。
- 整型提升:
char、short这类小于 int 的类型参与运算,会自动提升为 int 再计算。
char c=100; short s=2000; int i = c+s; //c和s提升为int之后再相加- 常规算术转换:不同大类型混合运算,统一转换成同一类型。int 和 float 运算,int 自动转为 float。
- 强制类型转换(显式转换)
格式:(类型)表达式
int a=5,b=2; float c = (float)a / b; //a强制转为float,实现浮点除法4.3 警惕问题表达式(未定义行为)
C 语言标准没有规定子表达式计算顺序,如果同一个变量在表达式中被多次修改,结果不可预测,不同编译器运行结果不一样,要坚决避免写这类代码。
示例(不要模仿):
int i =1; int r = (++i)+(++i)+(++i); //未定义行为,不同编译器输出不一样✅建议:尽量拆分复杂表达式,一行只做简单运算,不要把多个自增写在同一个表达式内。
📌本期学习总结
- 算术操作符重点记住整数除法陷阱,
%只能操作整数; - 分清赋值
=和相等判断==,复合赋值简化代码,尽量少写连续赋值; - 单目
++/--分清前置后置口诀,只能用于变量; - 表达式求值记住优先级、结合性;有隐式、强制类型转换;
- 拒绝问题表达式,不要在同一个表达式多次修改变量,保证代码可移植。
✍️课后小练习
- 敲代码对比
7/2和7.0/2的输出差异; - 写代码验证前置 ++、后置 ++ 变量变化;
- 使用强制类型转换,实现两个整数相除输出小数结果。