• 第一个C语言程序
  • 内存
  • 定义与声明
    • 变量是什么
    • 为什么要定义变量
    • 定义变量的本质
    • 定义声明
  • 关键字 - auto
    • 局部与全局变量
    • 作用域 vs 生命周期
    • auto
  • 关键字 - register
    • 寄存器本质
    • register 修饰变量
  • 1、多文件
    • 1.1、变量声明
    • 1.2、头文件包含内容
    • 1.3、函数声明
  • 1.4、跨文件
  • 2、static
  • 1、sizeof
  • 2、数据存储
    • 2.1、原反补
    • 2.2、整形存储的本质
      • 数据存储
      • 十进制-二进制
      • 二进制-十进制

《C语言深度解剖》

32个关键字 - C90标准

第一个C语言程序

#include <stdio.h>// 文本文件 - 可执行程序(二进制文件) - 双击启动该程序
// 生成可执行程序并运行int main()
{printf("hello world!\n");return 0;
}

内存

  1. 在win中,双击的本质运行程序,是将程序加载到内存中
  2. 任何程序是在被运行之前必须被加载到内存中
  • 程序没有被加载的时候,在硬盘中
  • 加载在内存中,因为快

定义与声明

变量是什么

在程序运行时开辟,用来保存数据

为什么要定义变量

因为数据不会立即被处理,需要暂时保存起来

定义变量的本质

所有变量,本质都是在内存中开辟空间,因为程序已经被加载到内存

定义声明

定义:开辟空间

声明:告知

关键字 - auto

局部与全局变量

局部变量:只在本代码块内有效

全局变量:整个程序运行期内,都有效

作用域 vs 生命周期

作用域:该变量的有效区域

生命周期:进开辟,出释放

auto

auto一般用来修饰局部变量

// test
#include <stdio.h>int main()
{for(int i = 0; i < 10; i++){printf("i = %d\n", i)if(1){int j = 1;printf("before: %d\n", j);j++;printf("after: %d\n", j);}}return 0;
}



关键字 - register

寄存器本质

在硬件层面上,提高计算机的运算效率,因为不需要从内存里读取数据了

register 修饰变量

尽量将所修饰的变量,放入CPU寄存区中,从而达到提高效率的目的

采用register的变量:

  1. 局部的
  2. 不会被写入的
  3. 高频被读取的
  4. 寄存器数量有限,编译器自动判断

register修饰的变量,不能取地址,因为已经在寄存器中了


1、多文件

1.1、变量声明

// test.c
int g_val = 100;// main.c
#include <stdio.h>extern int g_val;int main()
{printf("%d\n", g_val);return 0;
}// extern int g_val = 100; //err
// 申明并没有开辟空间
// =100 赋值或者初始化
// 所有的变量声明的时候,不能设置初始值

1.2、头文件包含内容

1、h基本都是要被多个源文件包含

2、头文件包含内容:

  • C头文件

  • 所有的变量的声明

  • #define 类型typedef,struct

3、头文件可能会被重复包含的问题解决方案:

加 #pragma once

1.3、函数声明

// test.h
#include <stdio.h>extern void show();// test.c
void show()
{printf("hello show()!\n");
}

1.4、跨文件

1、全局变量,全局函数 - 都可以跨文件 被访问

2、有一定规模的项目,一定是多文件的,多个文件之间后续一定要进行数据“交互”,如果不能跨文件,“交互”成本较高

2、static

1、修饰全局变量,该变量只能在本文件内被访问,不能被外部其他文件直接访问

2、修饰函数,该函数只能在本文件内被访问,不能被外部其他文件直接访问

3、修饰局部变量,更改局部变量的生命周期,作用域不变

项目维护 提供安全保障


1、sizeof

sizeof - 确定一种类型对应在开辟空间的时候 大小

#include <stdio.h>int main()
{int a = 10;printf("%d\n", sizeof(a)); // 4printf("%d\n", sizeof(int)); // 4printf("%d\n", sizeof a); // 4// printf("%d\n", sizeof int);  //err// sizeof 不是函数return 0;
}
  1. C中为什么要有类型:

    本质对内存进行合理化划分,按需索取

  2. 类型为什么在C中有这么多种:

    应用场景不同,解决应用场景对应的计算方式不同,需要空间的大小也是不同的。本质:用最小成本,解决各种多样化的场景问题。

#include <stdio.h>int main()
{int *p = NULL;int arr[10];int *test[3];printf("%d\n", sizeof(p)); // 4printf("%d\n", sizeof(arr)); // 4*10 printf("%d\n", sizeof(test)); // 4*3return 0;
}

2、数据存储

2.1、原反补

int main()
{int b = -20;// 16+4  16:2^4(10000)  4:2^2(100)// 1000 0000 0000 0000 0000 0000 0001 0100 原码// 1111 1111 1111 1111 1111 1111 1110 1011 反码+1// 1111 1111 1111 1111 1111 1111 1110 1100 补码
}
  1. 无符号数 - 原反补相同

  2. 求补码方法:

  • 方法一:补码减一得反码 反码按位取反得原码

    1111 1111 1111 1111 1111 1111 1110 1100 补码

    1111 1111 1111 1111 1111 1111 1110 1011 反码

    1000 0000 0000 0000 0000 0000 0001 0100 原码

  • 方法二:按规则 加一 取反

    计算机硬件完成,原 反 补

    可以使用一条硬件电路 完成转化

    1111 1111 1111 1111 1111 1111 1110 1100 补码

    1000 0000 0000 0000 0000 0000 0001 0011 反码+1

    1000 0000 0000 0000 0000 0000 0001 0100 原码

2.2、整形存储的本质

数据存储

unsigned int b = -10;

定义变量并做了初始化

将内容转化成二进制

补码:1111 1111 1111 1111 1111 1111 1111 0110

整形存储的时候,空间是不关心内容的

在将数据保存在空间内的时候,数据已经被转化成二进制

类型决定了如何解释空间内部保存的序列

变量存的过程:字面数据必须先转成补码,再放入空间当中。所以,符号位完全看数据本身是否携带±号,和变量是否有符号无关

变量取的过程:取数据一定要先看本身类型,然后再决定要不要看符号位。如果不需要,直接二进制转成十进制,如果需要,则需要转成原码,然后才能识别。

十进制-二进制

1 -> 2^0

10 ->2^1

100 ->2^2

1000 ->2^3

1后面加n个比特位 就是2^n

如67

67 - > 64+2+1

2^6 2^1 2^0

0000 0000 0000 0000 0000 0000 0100 0011

二进制-十进制

0000 0000 0000 0000 0000 0010 0100 0011

2^9 + 2^6 + 2^1 + 2^0 = 512+64+3 = 579

C语言深度解剖:关键字相关推荐

  1. c语言深度解剖-关键字

    C深度剖析 数据类型 本质:固定内存大小的别名 变量 本质:连续存储空间的别名 #include <stdio.h> ​ typedef int INT32; typedef unsign ...

  2. C语言深度解剖读书笔记(1.关键字的秘密)

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  3. 实验 c语言作用域实验,关于《C语言深度解剖》一些例程的实验和感悟——关键字static...

    最经买了一本好书--<C语言深度解剖>,书比较薄,看的比较快,而且也非常地吸引人,对于其中的一些讲解和例子都非常的经典,感觉有一些新的感悟.可能我的想法和水平非常菜,但是我只想是写点东西出 ...

  4. C语言深度解剖读书笔记

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  5. C语言深度解剖 PDF 分享

    链接:https://pan.baidu.com/s/1U-8L7ZY5_sLpk4p0J302Mg           提取码:d8nu 相关推荐 [Objective-c程序设计] 中文编程·学习 ...

  6. 《C语言深度解剖》中的.c/.h 程序模板及函数注释风格

    编程规范和变量命令规范对于代码的可阅读性.可维护性有着很大的影响.编程规范有很多,大公司也会制定自己公司的编程规范,如<华为技术有限公司c语言编程规范>等.对于个人编程来说没必要将自己编写 ...

  7. c语言深度解剖 pdf,c语言深度解剖(解密).pdf.pdf

    c语言深度解剖(解密).pdf.pdf 还剩 130页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: * Str ...

  8. C语言 | C语言深度解剖 ——章节2 符号

    C语言 | C语言深度解剖 --章节2 符号 C语言基本符号表 注释符号 // /* 几个似非而是的注释问题 y=x/*p 出色注释的基本要求 连接符和转义符 \ 单引号.双引号 花括号 运算符 10 ...

  9. C语言深度剖析——关键字sizeof、整型数据存储深入、数据类型取值范围深入

    1.关键字sizeof sizeof 与 strlen 是我们日常打代码时经常使用到的两个"工具".前者是求变量或者类型的大小(单位为字节),后者是求某一字符串的长度.我们很容易产 ...

最新文章

  1. python 回归去掉共线性_一文讲解机器学习算法中的共线性问题
  2. 跟我学Java(配光盘)(跟我学)
  3. wordpress CAS
  4. twisted系列教程七–小插曲,延迟对象
  5. 任晶磊:如何看待程序员在 GitHub 发起抗议互联网公司实行 996 工作制网站?
  6. sqlserver日志文件在哪_用友SQL SERVER数据库置疑修复实例
  7. 这些数据库领域的大事你知道多少?
  8. 自学python编程笔记本推荐-python自学教程 | 3万字为你详解每个重要知识点
  9. c语言编程泰勒展开式计算,学习笔记:用c语言编写泰勒展开公式myexp()实现math.h.数学函数...
  10. Linux vi/vim 中的一些技巧
  11. grafana-reporter安装及配置
  12. activemq、rabbitmq、kafka原理和比较
  13. PS 切片工具的使用
  14. Istio的流量镜像
  15. (C++)1~10000质数表
  16. web CSS 颜色渐变代码
  17. synchronized同步机制——如果你愿意一层一层剥开我的心
  18. 东师《近代物理实验》离线作业网考
  19. ARM ADDS和ADCS的区别
  20. 在zedGraph曲线上显示数据,显示波峰,寻峰算法的实现

热门文章

  1. mysql 代码结构_MySQL代码执行结构
  2. springboot读取src下文件_springboot获取src/main/resource下的文件
  3. 以太坊开发入门,如何搭建一个区块链DApp投票系统
  4. mybatis xml标签,批量插入
  5. Spring学习4-面向切面(AOP)之Spring接口方式
  6. SQL Server-流程控制 6,WaitFor 语句
  7. javascript中动态加载js、vbs脚本或者css样式表
  8. A. 抽象类和抽象方法(abstract)
  9. hive中的日期转换函数
  10. iOS UIWebView 之 UIProgressView