/ 除法规则
两个整数相除 → 整数除法,只取商,舍弃小数部分
printf("%d\n", 6 / 3); //2 printf("%d\n", 6 / 4); //1只要有一边是小数(浮点数),就做浮点除法,得到小数结果
printf("%.2f\n", 6 / 4.0); //1.50 printf("%.2f\n", 6.0 / 4); //1.50 printf("%.2f\n", 6.0 / 4.0); //1.50格式符说明
a)%d:打印int 整数
b)%f:打印float和double,默认输出小数点后 6 位
c)%lf:输入scanf读 double 用;printf输出 double 也可以用%f强制类型转换
int a, b; a = 5; b = 2; printf("%.2f\n", a / (double)b); //2.50 printf("%d\n", a / b); //2
分析代码
int score = 5; score = (score / 20.0) * 100; printf("%d\n", score); //得25 int a = 5; double res= (a / 20.0) * 100; printf("%.2f\n", res); //得25.00a)score = 5(int 类型)
b)score / 20.0:5是 int,20.0是 double,发生隐式类型转换,5 提升为 double
5/20.0=0.25
c)0.25 * 100 = 25.0(double)
d)把25.0的 double 赋值给int score:double → int,直接截断小数部分,得到整数 25
浮点数赋值给 int 变量:截断小数,只留整数
例子(如下):
int score =5; score = (score / 20) * 100;两整数相除会截断小数 , 5 / 20 = 0 ,然后 0 * 100 =0
2.
int a = 3.5; printf("%d\n", a);分析:
a)3.5 是double 浮点数
b)a 是 int 整型变量
c)把小数赋值给 int,会直接截断小数部分,丢掉小数点后面所有内容,只保留整数部分
结论:
a)int 只能存整数,给它小数,自动截断小数
b)double / float 才可以保存小数
double b = 3.5; printf("%.2f\n", b); //3.50重点区分
a)截断 ≠ 四舍五入
int c = 3.99; printf("%d\n", c); //3b)四舍五入要使用 round() 函数,需要 <math.h>
int d = round(3.88); printf("%d\n", d); //4
% 取模(求余数)运算符
6=4×1+2
int ret = 6 % 4; printf("%d\n", ret); //2知识点
a)% 只适用于整数,不能用于浮点数
b)余数符号和被除数 保持一致
printf("%d", -6 % 4); // -2 printf("%d", 6 % -4); // 2
连续赋值
赋值运算符=结合性是从右往左
例子:c = b = a + 3 等价于 b = a + 3 ; c = b
知识点
a)初始化:int a=3; 创建变量同时给值
b)赋值:a=200; 变量已经存在,修改里面的数据
c)=不是数学的等于,是把右边的值拷贝给左边变量
d)连续赋值:c = b = a + 3 先算最右边表达式,再从右往左逐个赋值思考题
int a=3,b=5,c=0; c = (b = a + 3) + 2; printf("%d %d",b,c);解答: 括号优先,先执行 b=a+3 ,再加2 ,赋值给c
//连续赋值 int a = 3; int b = 5; int c = 0; c = b = a + 3; printf("%d\n", c); printf("%d\n", b);
复合赋值运算符
+=,-=,*=,/=
//复合赋值运算符 int a = 3; printf("%d\n", a); a += 3; //a=a+3; printf("%d\n", a); a -= 3; //a=a-3; printf("%d\n", a); a *= 3; //a=a*3; printf("%d\n", a); a /= 3; //a=a/3; printf("%d\n", a);
自增运算符 ++
四种自增反式
int a = 5; /*a = a + 1;*/ /*a += 1;*/ /*a++;*/ /*++a;*/ printf("%d\n", a);后置和前置自增区别
后置 a++:先使用旧值,再自增
//后置++ int a = 5; int b = a++; //先把5赋值给b,然后a再加 1 printf("a = %d b = %d", a, b); b=a++ 等价与于 b=a a=a+1前置 ++a:先自增,再使用新值
// 前置 ++ int c = 5; int d = ++c; // c先加1,然后赋值给d printf("c = %d d = %d\n", c, d); d = ++c 等价 c=c+1 d=c易错经典例子(面试常考)
int a1 = 5; printf("%d\n", a1++); //先打印5,后a+1 int b1 = 5; printf("%d\n", ++b1); //b1 先加1,后打印b1总结
a)单独一行写 a++; 或者 ++a;,没有任何差别
b)放进别的表达式里面:
a++ :先用值,再加
++a :先加,再用值自减--
前置-- 后置-- 区别
前置--:先自减,再拿新值使用
int a = 10; int b = --a; //等价 a=a-1 b=a //计算口诀:先-- ,再使用 printf("a=%d\n", a); //9 printf("b=%d\n", b); //9后置 --:先拿原值使用,然后再自减
int a1 = 10; int b1 = a1--; // 等价 b1=a1 a1=a1-1 //计算口诀:先使用,后减1 printf("a1=%d\n", a1); // 9 printf("b1=%d\n", b1); // 10总结
a)--a 前置:先减再用,变量和接收值一样
b)a-- 后置:先用再减,接收的是旧值,变量本身变小
问题代码
这是问题代码,不能写这种代码
int a = 1; printf("%d\n", (++a) + (++a) + (++a));(++a)+(++a)+(++a) 属于 C 语言里的未定义行为,结果是不确定的,不同编译器跑出来答案不一样
