C语言特点
- 优点:
1. 代码量小
2. 执行速度快
3. 功能强大
4. 变成自由 - 缺点:
1. 写代码周期长
2. 可移植性差
3. 过于自由,经验不足容易出错
4. 平台库依赖较多
C 语言领域
- 后台
- 程序库
- 游戏引擎
- 开发语言
- 驱动 系统
- 任何设备
- 常见的:
1. 游戏
2. 服务器
3. 桌面
4. 操作系统
HelloWorld程序
使用工具VS2015
步骤
- 新建项目
- 选择 v c++
- win32 控制应用程序
- 应用程序设置中,选择空项目,安全并发生命周期可以不选
- 查看解决方案管理器(管理源文件用),如果没有此栏可以从视图中打开
- 源文件需要从工程中源文件目录下进行创建,添加-> 新建项
- 我们添加项的时候同命名为.c即可 就是c语言文件
- 编写代码如下:
#include <stdio.h>
int main()
{
printf("hello_world 程序");
return 0;
}
- Ctrl+F5进行直接执行
- gcc 的执行方式
- 需要安装qt 使用其中tools的gcc
- 配置全局环境变量path
- 使用gcc编译代码 gcc **.c -o **.exe ,这里 -o 是生成目标可执行文件
C语言编译步骤
- 预处理
- gcc -E ***.c -o ***.i
- 这是生成预处理文件
- #号开头的是预处理指令,.h是头文件,对一些函数声明用的
- C 语言中的注释 // /* */,注释的不会被编译到文件中
- 宏替换
- #define 这个是用来定义的,定义的宏 类似于Java中的属性变量 - 预处理的时候不会检擦语法错误
- 条件编译 #if 条件 #endIf , 0在c语言中是不成立
- 这个条件是用来那个平台的驱动,这个平台是否使用这段代码
- -D 可以在后面动态添加编译条件
- 编译
- -S .s 文件 生成的汇编语言,汇编语言,会检查语法错误 - 汇编
- -c .o文件 ,这是二进制文件,不可执行的文件 - 链接
- 设置运行环境 添加需要的库文件
- 命令: gcc **.o -o **.exe
System 函数
在程序启动,可以启动另一个程序
- 引入依赖如下:
#include <stdlib.h>
- 系统暂停,按任意键继续,指令:
system("pause")
CPU 内部结构与寄存器
- 寄存器是Cpu的内部最基本的存储单元,存储CPU计算的数据
数据类型
- 分配内存空间大小
- 作用: 数据类型就是告诉编译器 我这个数据在内存中需要多大空间
常量
程序运行中不能改变的量
- 整形常量 : 1 200
- 字符常量 : ’a‘
- 字符串常量: ”aaaa“
- 浮点型常量: 2.2222
变量
程序运行中可以被改变,存在内存中
变量需要定义
在内存中开辟空间
需要声明
定义形式 : 数据类型: 变量名
- int 类型占4个字节
- short 2个字节
- long 在win4字节 linux 32位4字节 64位 8字节
- char类型 1个
- extern 告诉编译器,我有这个变量尚未定义
- const 修饰的变量
- const修饰的变量不能被修改
进制
什么是十进制:
- 逢十进一 0-9
什么是二进制 - 逢二进一 0-1
什么八进制 - 逢八进一 0-7
C 语言中不能书写二进制
符号位
有符号数 默认: 可以表示正数和负数
无符号数: 只能表示正数
第一位是符号位,如果是0 则是正数 如果是1则是负数
数的范围
- 列子: char 有符号 -128-127 表示256个数,无符号数0-255
原码
数的最原始的二进制码
负数在计算机中存储原码问题:
- 运算结果不正确
- 0的状态有两种
反码
正数不变,负数反码(符号位不变,其他位数取反)
反码去存值正确,但是0的状态还是会有两种
补码
正数不变,负数补码等于反码加1
进制的输出格式
- %d 十进制 有符号打印 会转成32位
- %o 八进制
- %x 十六进制
- %#x 携带十六进制头的十六进制
- %u 无符号 会转成32位
整型变量输入
- scanf 从键盘读取数
- 实例:
int main()
{
int sum = 0;
int count = 0;
scanf("%d %d", &sum, &count);
printf("%d\n", sum);
printf("%d\n", count);
return 0;
}
测试变量长度关键字
sizeof : 测试数据类型的大小
浮点型
- float 4个字节,能够保证7位有效数字
- double 8个字节 精度15位
限定符
- extern 声明,告诉编译器有这个东西不开辟空间
- const 定义了一个变量不能改变;
- volatile 防止编译器优化 ,跟随每个变量,一般写驱动内核使用;
- register 建议将变量定义在寄存器,频繁使用计算的变量使用;
字符串
- 打印命令:
printf("%s\n", "我是你爹");
- 字符串 0 会被进行转移位 \0 ,这个0 == ‘\0’;
scanf 和 getchar 函数的比较
- 作用: 都是从键盘读取一个字符;
运算符
算数运算符
加 减 乘 除
负值运算符
运算符优先等级
第一级
- [ ]
- ( )
相同优先级的会从右向左进行计算
逗号运算符,结果为最后一个运算
程序选择结构问题
- 顺序
- 从上向下执行
- 选择
- if
- 循环
数组名
数组名等于首元素(第0个)元素的地址,数组名+1 会跳过一个字节,数组名地址值+1 会跳过整个数组,数组名是常量不能被赋值