> 文章列表 > 筑基六层 —— 整型提升及实用调式技巧

筑基六层 —— 整型提升及实用调式技巧

筑基六层 —— 整型提升及实用调式技巧

目录

一.修炼必备

二. 整型提升

三.实用调式技巧


一.修炼必备

 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)

 2.趁手武器:印象笔记/有道云笔记

 3.修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

 4.雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

 注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)

二. 整型提升

 1.什么是整型提升?

    ——C语言是整型算术运算总数以缺省整型精度运算的,为了得到这个精度,我们需要把短整型和字符型的数据在使用之前转换为普通整型。

 2.整型提升的意义?

    ——表达式的整型运算要在CPU的相应运算器件内执行,CPU内的整型运算器的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度;通用CPU是难以实现两个8比特位的数进行计算的,所有,表达式中小于int长度的整型值,万能均要把它转化为int的长度来进行计算,最后进行截断

 3.整型提升的范围

    ——char、short自身类型的值进行混合运算的时候会进行整型提升

 4.整型提升发生在什么时候?

    ——整型提升是按照变量的数据类型的符号位来提升的

1)负整数进行整型提升的时候,补1

2)正整数进行整型提升的时候,补0

3)无符号数进行整型提升的时候,补0

 5.几个小case快速上手整型提升

  1)case 1:

#include <stdio.h>int main()
{char a = 0xb6;//10110110//11111111 11111111 11111111 10110110  整型提升//10110110  截断//10110101//11001010  原码 : -74//打印查看结果printf("%d\\n", a);//-74short b = 0xb600;//10110110 00000000 原码//11111111 11111111 10110110 00000000 --> 整型提升//10110110 00000000  截断//10110101 11111111//11001010 00000000  原码:-18944//打印查看结果printf("%d\\n", b);//-18944int c = 0xb6000000;if (a == 0xb6){printf("a\\n");}if (b == 0xb600){printf("b\\n");}if (c == 0xb6000000){printf("c\\n");//c}return 0;
}

  2)case 2:

#include <stdio.h>
int main()
{char c = 0;printf("%u\\n", sizeof(c));//1//注:只要进行运算,那就会发生整型提升printf("%u\\n", sizeof(+c));//4printf("%u\\n", sizeof(-c));//4return 0;
}

  3)case 3:

#include <stdio.h>int main()
{char a = 3;//00000101char b = 127;//01111111char c = a + b;//注:在运算的时候才会出现整型提升,写在上面是为了方便//00000011  : 3//01111111  : 127//10000010  结果//11111111 11111111 11111111 10000010//10000010  截断//10000001//11111110  -126printf("%d\\n", c); //-126return 0;
}

三.实用调式技巧

 1.什么是bug?

    ——bug就是指程序中出现的错误,有很多bug的程序不是优秀的程序,我们应该把自己的程序的bug降低到可控范围内

 2.有那些bug?

  1)编译性错误,这种类型的bug编译器能给出提示,按照编译器的提示解决问题即可

  2)连接性错误,这种错误一般是标识符名字拼写错误或标识符不存在

  3)运行时的bug,这种bug编译器一般不会给出提示,需要我们自己去查找(最难)

 3.为什么需要调式?

    ——因为有一些bug编译器不能明显的给出提示,这个时候我们就需要通过调试去查找bug

 4.如何进行调式?

  1)发现程序错误的存在

  2)以隔离、消除等方式对错误进行定位

  3)确定错误产生的原因

  4)提出错误的纠正方法

  5)对程序给予改正,再重新测试

 5.调式的快捷键

  1)F10:逐过程调式(该过程可以是一个函数或一条语句)

  2)F11:逐行调式(会进入方法的内部进行调式)

  3)F9:创建断点和取消断点

  4)F5:开始调式,会直接跳到有断点的地方(和F9搭配使用)

 6.tips

  1)调试过程中查看变量

    ——点击调式、窗口、监视、然后随便选择一个监视

  2)查看变量的内存信息

    ——调式、窗口、内存、选择任意一个内存打开

  3)调用堆栈

    ——通过调用堆栈,清晰的看出函数之间调用的关系以及当前调用所处位置

 7.调式以下代码,说出问题所在

  case 1:求出1-10的阶乘 

#include <stdio.h>
int main()
{int i = 0;int sum = 0;//保存最终结果int n = 0;int ret = 1;//保存n的阶乘scanf("%d", &n);for (i = 1; i <= n; i++){int j = 0;for (j = 1; j <= i; j++){ret *= j;}sum += ret;}printf("%d\\n", sum);return 0;
}

  case 2:说出死循环的原因

#include <stdio.h>
int main()
{int i = 0;int arr[10] = { 0 };//在VS2019中,栈中会留出两个int的空间//i和arr[12]占用了同一个内存空间,所有arr[12]的改变影响了ifor (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\\n");}return 0;
}

 8.怎样写出优秀的代码

  1)使用assert

  2)在值不改变的情况下使用const

  3)养成良好的编程风格

  4)添加必要的注释

  5)要注意编码的陷阱

 9.模拟实现strlen函数求字符串

#include <stdio.h>
#include <string.h>
#include <assert.h>//加const是为了防止不小心修改了arr
int my_strlen(const char* arr)
{assert(arr);//防止arr是NULLint count = 0;while (*arr++ != '\\0'){count++;}return count;
}int main()
{char arr[100] = "husdghfjgfghkshf";//int len = strlen(arr);//printf("%d\\n", len);//16int len = my_strlen(arr);printf("%d", len);return 0;
}

   !!!恭喜你,突破至筑基六层!!!

  注:由于CSDN排版问题,想要美观的文章阅读,请前往有道云阅读:有道云笔记