1. 第一个c语言程序
解释:main函数是c语言程序入口,代码是从main函数的第一行开始执行,main函数在一个工程中只能又一个。
2. 数据类型
C语言中有许多数据类型
char 字符数据类型
short 短整型
long 长整型
long long 更长的整型
float 单精度浮点数
double 双精度浮点数
每种类型的大小是多少?
利用sizeof标识符可以求出这些数据类型的大小,单位是字节。图中可以看到,long的大小与int相同,这是因为C语言规定long long >= long >= int,所以long可以为4字节,在不同的编译环境下,long的值会有所不同。下面的double同理。
计算机内存单位:计算机能够识别的是二进制0和1,在内存中一个0和1占用一个bit位,还有以下换算关系。
1byte = 8bit
1kb = 1024byte
1mb = 1024kb
1gb = 1024mb
1tb = 1024gb
1b = 1024tb
3. 变量、常量
生活中的有些值是不变的(比如:圆周率、身份证号码、血型等),有些值是可变的(比如:身高、体重、年龄)。
不变的值,c语言中用常量的概念来表示,变的值c语言中用变量来表示。
3.1 定义变量的方法
类型 变量名 = 值
比如:int age = 150,
float weight = 45.5f,
char ch = 'w'.
3.2 变量的分类
1.全局变量:在大括号(代码块)外部定义的变量
2.局部变量:在大括号(代码块)内部定义的变量
注:局部变量就是在main函数中定义的变量(错误,如果是重新创建一个函数,里面创建的函数也可以是局部变量)。
当局部变量和全局变量同名的时候,局部变量优先使用。
3.3 变量的作用域和生命周期
作用域:程序设计概念,通常来说,一段代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
局部变量的作用域是:局部变量所在的局部范围。
全局变量的作用域是:整个工程。
生命周期:变量的生命周期指的是变量的创建到变量销毁之间的一个时间段。
局部变量生命周期:进入局部范围声明周期开始,出了局部范围生命周期结束。
全局变量生命周期:就是程序的生命周期。
3.4 常量
C语言中常量与变量的定义的形式有所差异。
C语言中的常量分为以下几种:
1.字面常量
2.const修饰的常量
3.#define定义的标识符常量
4.枚举常量
注:其中的pai虽然是const修饰的常量,但本质还是变量,只是具有常属性。虽本质是变量,但const修饰的常量,在之后不能为其赋值进行数值的改变。
在C99标准之前,数组的的大小只能是常量,所以const修饰的常量不能用来定义数组中的元素个数。
4.字符串+转义字符
4.1字符串
注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不能算作字符串内容。
在自定义的数组中,如果是以arr2以单个字符依次保存字符串的,因为后面没有/0,所以printf会打印arr2后面在内存中生成的随机数,直到遇见\0才停止,所以可见图上乱码.
这张图可以很好论证,当我在arr2后面加入'\0', 打印arr2只会打印abc,因为arr2遇见'\0',会停止打印.
运用函数strlen(统计‘\0’之前的字符个数)也可以达到同样的效果,函数strlen遇见‘\0’时就会停止统计字符串长度。
4.2转义字符
转义字符顾名思义就是转变意思,当一些数字或者符号遇到\的时候就会改变原来的意思,转变为其他意思。
上表是c语言中常用的转义字符。
5.操作符
单目操作符
~:按(2进制)位取反。
如果一个整数储存在内存中的二进制序列是:
11110000111100000000000000001111
那么按位取反的结果是:
00001111000011111111111111110000
整数在内存中存放的是二进制的补码。
整数的二进制表示方式有三种:
原码:直接按照数字正负转换成二进制就是原码。
反码:原码的符号位不变,其他位按位取反,就是反码
补码:反码加一就是补码。
规定:
对于有符号整数,二进制的最高位是符号位。
最高位是0,表示正数。
最高位是1,表示负数。
正整数的原码、反码、补码相同。
负整数的原码、反码、补码需要计算。
在上面这个例子中a
原码是:0000000000000000000000000000000
反码是:0000000000000000000000000000000
补码是:0000000000000000000000000000000
按位取反后
补码是:1111111111111111111111111111111
反码是:1111111111111111111111111111110
原码是:100000000000000000000000001
所以打印结果是-1。
在上面这个例子中b
原码是:1000000000000000000000000000001
反码是:1111111111111111111111111111110
补码是:1111111111111111111111111111111
按位取反后
补码:0000000000000000000000000000000
反码:0000000000000000000000000000000
原码:0000000000000000000000000000000
所以打印结果是0。
注:按位取反是对补码进行操作,但是打印是对原码进行打印。
11.常见关键字
11.1关键字typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
11.2关键字static
static 有3种用法
1, static修饰局部变量
使得局部变量出了自己的范围也不销毁,其实是改变了局部变量的生命周期
但是作用域还是局部的。
2. static修饰全局变量
全局变量本身是具有外部链接属性
但是static修饰全局变量,会使得全局变量失去外部链接属性
变成内部链接属性
所以static修饰的全局变量,只能在自己所在的.c文件中使用
3. static修饰函数
函数默认是具有外部链接属性
但是被static修饰之后,会使得函数失去外部链接属性
变成了内部链接属性
所以static修饰的函数只能在自己所在的.c文件内部使用
不能在其他文件使用