C语言基础(一)
- 程序
- 程序的设计步骤
- 计算机中数据表示
- 非数值数据
- 数值转换
- (二、八、十六)进制转十进制
- 十进制转换(二、八、十六)进制
- 二进制和八、十六进制转换
- 基本数据类型
- 关键字(32个)
- 标识符
- 基本数据类型大小
- 有符号数和无符号数
- 字符型家族char
- 整型家族int
- 浮点型家族
- 数据类型转换
- 强制类型转换
- 隐式类型转换(编译器进行转换)
- 转义字符
- 常量
- 字符常量
- 整型常量
- 浮点型常量
- 字符串常量
- 标识常量(宏)(符号常量)
- 宏只是一个简单的替换
- 变量
- 全局变量与局部变量
- 存储类型
- 初始化
- extern
- static
- 生命周期和作用域
- 生命周期
- 作用域
程序
- 计算机能够识别的一组有序的指令
hello.c和a.out哪个是程序?
a.out是程序,是计算机能够识别的指令
程序的设计步骤
- 预处理 生成.i文件
- 编译阶段 检测代码规范型、是否有语法错误,再翻译成汇编语言。生成.s文件
- 汇编阶段 生成.o文件
- 链接阶段 链接库函数文件
计算机中数据表示
非数值数据
- 不能够直接进行计算的数据
- 通过ascll码以二进制形式存储
数值转换
二进制 八进制 十进制 十六进制
(二、八、十六)进制转十进制
对应的数字乘以其他进制的位数次幂
-
二进制转十进制
1011 ——> 12 ^ 0 + 12 ^ 1 + 02 ^ 2 +12 ^ 3 -
八进制转十进制(八进制以0开头)
076 ——> 68 ^ 0 + 78 ^ 1 -
十六进制转十进制(十六进制以0x开头)
0xafc ——> 1216 ^ 0 + 1516 ^ 1 +10*16 ^ 2
十进制转换(二、八、十六)进制
除以其他进制倒取余数
-
十进制转二进制(除2倒取余)
34 ——> 0010 0010
-
十进制转八进制(除8倒取余)
34 ——> 042 -
十进制转十六进制(除16倒取余)
34 ——> 0x22
二进制和八、十六进制转换
- 二进制和八进制转换
每一个八进制可以用三位二进制数进行表示
0 —— 000
1 —— 001
2 —— 010
3 —— 011
4 —— 100
5 —— 101
6 —— 110
7 —— 111
10 101 001转换为八进制:0251
076转换为二进制:111 110
- 二进制和十六进制相互转换
每一个十六进制可以用四位二进制数去表示
0 —— 0000
1 —— 0001
2 —— 0010
3 —— 0011
4 —— 0100
5 —— 0101
6 —— 0110
7 —— 0111
8 —— 1000
9 —— 1001
a —— 1010
b —— 1011
c —— 1100
d —— 1101
e —— 1110
f —— 1111
10 1001 0101转换为十六进制:0x295
0xa865转换为二进制:1100 1000 0110 0101
基本数据类型
关键字(32个)
- 系统预先定义好的,有特定含义的,都是小写,不能重新定义
数据类型:char、short、int、long、float、double、struct、union、enum、void
控制语句:if、else、while、switch、case、default、break、continue、for、do、goto
存储类型:auto、static、extern、register
return:返回函数
const:只读
signed:有符号数
unsigned:无符号数
sizeof:求所占内存空间大小
typedef:给已有的数据类型起别名
volatile:防止编译器优化
标识符
-
程序员自己去定义的,一般用来定义变量名,函数名,类型名
要求:见名知意 -
不能和关键字重名
-
由数字、字母、下划线组成
-
第一个不能为数字
基本数据类型大小
32OS
字符型:char(1字节)
整型:int(4字节) short(2字节)long(4字节)
浮点型:float(4字节) double(8字节)
注:使用sizeof求得上述数据
64OS
字符型:char(1字节)
整型:int(4字节) short(2字节) long(8字节)
浮点型:float(4字节) double(8字节)
有符号数和无符号数
- 有符号数:signed——>正数和负数
- 数值数据在计算机中以二进制进行存储,并且所有数据在计算机中都是以补码的方式存储
- 符号位:最高位为符号位,0表示正数,1表示负数
10 ——> 0000 1010
-10 ——> 1000 1010
正数(原码,反码,补码都是一样的)
eg:10
原码:0000 1010
反码:0000 1010
补码:0000 1010
负数
(原码:最高位为符号位;
反码:符号位不变,其他位取反;
补码:反码+1)
eg:-10
原码:1000 1010
反码:1111 0101
补码:1111 0110
知道一个负数的补码,怎样求原码?
- 补码-1,然后符号位不变,其他位取反
- 补码的补码就是原码
无符号数:unsigned ——>正数
字符型家族char
值域范围
char(1byte = 8bit)
unsigned: 0000 0000 ~ 1111 1111 (0~255)
signed: 1000 0000 ~ 0111 1111 (-128~127)
超级重点!!!超范围情况下,应该转圈循坏计算数值
//unsigned char 0~255
unsigned char c = 260;
printf("%d\n", c);//——>4
255 256 257 258 259 260
—— 0— 1— 2— 3—— 4
//signed char -128~127
signed char a = 130;
printf("%d\n", a);//——>-126
127 128 129 130
—— -128 -127 -126
//signed short int -32768~32767
//unsigned short int 0~65535
short i = 65535;
printf(“%d\n”,i);
32767 32768 32769 … 65535
—— -32768 -32766 … -1
整型家族int
int(4byte = 32bit)
unsigned:(0~2^32 -1)
signed:(-2 ^ 31 ~ 2 ^ 31 -1)
浮点型家族
float(4byte):%f
double(8byte) :%lf
注:%f和%lf默认输出小数点后六位
数据类型转换
强制类型转换
float a = 3.14;
int b = 0;
b = (int)a;//b=3
隐式类型转换(编译器进行转换)
横向箭头:不管有没有混合运算,都会进行转换
纵向箭头:只有进行混合运算,才会进行转换
四种类型char和short
signed char和unsigned char未进行转换
转义字符
‘\123’ 三位八进制 (1个字符)
‘\045’ 三位八进制
‘\x45’ 二位十六进制 (1个字符)
常量
程序运行期间,其数值不会也不能改变的量
字符常量
整型常量
浮点型常量
指数形式:1e+4 1e-4
%g:选择小数或者指数较短的一种进行输出(合适的一种)
字符串常量
字符串常量以’\0’作为结束符
- 用sizeof()函数是求字符串所占空间大小
- 用库函数strlen()函数是求字符串长度
- hello字符串所占空间大小为6,字符串长度为5,不包含’\0’
标识常量(宏)(符号常量)
是程序员自己定义的一个特殊的标识符,代表一个恒定的值
好处在于提高代码的可读性和可维护性,当需要修改某个常量的值时,只需要在定义出修改一次,不需要在整个程序中修改
#define 宏名 表达式
注意:
1、宏名用大写字母
2、宏后面无分号!!!
宏只是一个简单的替换
宏函数(既有宏的特点,又有宏函数的特点)
#define 函数名(形参) 函数体
宏只是一个单纯的替换,不会考虑优先级的问题,所有需要给每个形参手动加一个括号,以及整个表达式加一个括号
变量
变量意味着要开辟空间
<存储类型> 数据类型 变量名;
int a;
- 数据类型:决定开辟空间的大小
- 数据类型:char int short long float double
- 存储类型:决定开辟的空间在哪个分区
- 存储类型:static auto register extren
全局变量与局部变量
- 全局变量:定义在函数体外的变量(存放在静态区)
- 局部变量:定义在函数体内的变量(存放在栈区)
存储类型
auto register extern static
- auto:只能用来修饰局部变量,修饰的变量存放在栈区
- register:只能修饰局部变量,修饰的变量存放在寄存器中,可以提高速度,如果寄存器已满,会将变量存放在栈区
- extern:只能修饰全局变量,修饰的变量存放在静态区
- static:即可修饰全变变量,也可以修饰局部变量,修饰的变量存放在静态区
初始化
定义变量的时候就给变量赋值
注意区分初始化和赋值
int a = 9;//初始化
int b;//定义变量
b = 3;//赋值
在32OS中
1、全局变量不初始化,其值为0,存放在静态区.bss文件中;若初始化,存放在静态区.data文件中
2、局部变量不初始化,其值为随机值,存放在栈区;
extern
- 修饰全局变量,存放在栈区
- 程序可以由多个.c文件组成,但是main函数只能有一个
static
- 既可以修饰全局变量,也可修饰局部变量,修饰变量的时候存储在静态区
修饰局部变量:延长局部变量的生命周期(不改变其作用域),如果局部变量没有初始化,其值为0,如果初始化过了,那么只能初始化一次
修饰全局变量:限制作用域(只能在本文件内使用)不改变其生命周期
生命周期和作用域
生命周期
一个变量从什么时候开辟空间到什么时候释放空间的时间段
作用域
一个变量可以使用的范围
局部变量:
1、生命周期:从定义开始到模块代码(大括号)结束
2、作用域:大括号内
全局变量
1、生命周期:从定义开始到整个程序结束
2、作用域:整个程序
static修饰的局部变量
1、生命周期:从定义开始到整个程序结束
2、作用域:大括号内
static修饰的全局变量
1、生命周期:从定义开始到整个程序结束
2、作用域:本文件内