【C语言】数据类型和变量【下】

/ 除法规则

  1. 两个整数相除 → 整数除法,只取商,舍弃小数部分

    复制代码
    printf("%d\n", 6 / 3);  //2
    printf("%d\n", 6 / 4);  //1
  2. 只要有一边是小数(浮点数),就做浮点除法,得到小数结果

    复制代码
    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
  3. 格式符说明
    a)%d:打印int 整数
    b)%f:打印float和double,默认输出小数点后 6 位
    c)%lf:输入scanf读 double 用;printf输出 double 也可以用%f

  4. 强制类型转换

    复制代码
    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.00

a)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);  //3

b)四舍五入要使用 round() 函数,需要 <math.h>

复制代码
   int d = round(3.88);
   printf("%d\n", d);  //4

% 取模(求余数)运算符

  1. 6=4×1+2

    复制代码
    int ret = 6 % 4;
    	printf("%d\n", ret);	//2
  2. 知识点
    a)% 只适用于整数,不能用于浮点数
    b)余数符号和被除数 保持一致

    复制代码
    printf("%d", -6 % 4);  // -2
    printf("%d", 6 % -4);  // 2

连续赋值

  1. 赋值运算符=结合性是从右往左

    例子:c = b = a + 3 等价于 b = a + 3 ; c = b

  2. 知识点
    a)初始化:int a=3; 创建变量同时给值
    b)赋值:a=200; 变量已经存在,修改里面的数据
    c)=不是数学的等于,是把右边的值拷贝给左边变量
    d)连续赋值:c = b = a + 3 先算最右边表达式,再从右往左逐个赋值

  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);

复合赋值运算符

  1. +=,-=,*=,/=

    复制代码
    //复合赋值运算符
    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);

自增运算符 ++

  1. 四种自增反式

    复制代码
    int a = 5;
    /*a = a + 1;*/
    /*a += 1;*/
    /*a++;*/
    /*++a;*/
    
    printf("%d\n", a);

后置和前置自增区别

  1. 后置 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
  2. 前置 ++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
  3. 易错经典例子(面试常考)

    复制代码
    int a1 = 5;
    printf("%d\n", a1++); //先打印5,后a+1
    
    int b1 = 5;
    printf("%d\n", ++b1); //b1 先加1,后打印b1
  4. 总结
    a)单独一行写 a++; 或者 ++a;,没有任何差别
    b)放进别的表达式里面:
    a++ :先用值,再加
    ++a :先加,再用值

自减--

前置-- 后置-- 区别

  1. 前置--:先自减,再拿新值使用

    复制代码
    int a = 10;
    int b = --a;
    //等价 a=a-1 b=a
    //计算口诀:先-- ,再使用
    printf("a=%d\n", a); //9
    printf("b=%d\n", b); //9
  2. 后置 --:先拿原值使用,然后再自减

    复制代码
    	int a1 = 10;
    	int b1 = a1--; 
    	// 等价 b1=a1 a1=a1-1
    	//计算口诀:先使用,后减1
    	printf("a1=%d\n", a1); // 9
    	printf("b1=%d\n", b1); // 10
  3. 总结
    a)--a 前置:先减再用,变量和接收值一样
    b)a-- 后置:先用再减,接收的是旧值,变量本身变小

问题代码

  1. 这是问题代码,不能写这种代码

    复制代码
    int a = 1;
    	printf("%d\n", (++a) + (++a) + (++a));

    (++a)+(++a)+(++a) 属于 C 语言里的未定义行为,结果是不确定的,不同编译器跑出来答案不一样

相关推荐
小雪崩2 小时前
嵌入式学习 day30:minilog
linux·c语言·学习
二级小助手7 小时前
C语言二级操作题高频真题精解与大题代码模板
c语言·计算机二级·二级c语言·c语言操作题·c语言真题·c语言大题
kkkkkkkkkk_Z16 小时前
学嵌入式和C语言编程数据结构|学习日记Day22:栈,二叉树,哈希存储
c语言·数据结构·学习
Navigator_Z16 小时前
LeetCode //C - 1206. Design Skiplist
c语言·算法·leetcode
码行山野赴时序归途16 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
Navigator_Z18 小时前
LeetCode //C - 1209. Remove All Adjacent Duplicates in String II
c语言·算法·leetcode
码行山野赴时序归途20 小时前
算法效率的度量(上):时间复杂度中的对数思维
c语言·数据结构·算法
单片机仿真设计1 天前
【proteus仿真】基于 STM32 的智能垃圾桶设计(仿真图+程序)
c语言·stm32·stm32单片机·proteus·毕设·仿真
是隼人1 天前
buuctf-pwn axb_2019_fmt32题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门