编译型语言:
需要先编译再执行
C语言 -> 二进制文件
Linux C语言开发步骤:
1.编写程序
vim filename.c
点击 i a o
点击ESC
输入:wq
2.编译程序
gcc filename.c
3.执行程序
./a.out
GCC编译器
gcc编译器: 4.6.3
C语言程序编译成可以执行的二进制程序
gcc filename.c
-v 查看版本
-o 设定编译生成文件的名字
-E 将程序完成预处理编译
-S 将程序完成预处理、编译操作
-c 将程序完成预处理、编译、汇编操作
-Wall 编译器编译时,不优化,将警告信息全部打印
警告:编译通过,但可能在警告处出现错误
报错:编译未通过,语法存在错误
gcc四个流程步骤:
1.预处理
处理C语言中和#号相关的代码
1.头文件展开
#include
2.宏定义替换
#define M 50
3.条件编译
满足条件的代码加入编译
不满足条件的代码不加入编译
gcc -E filename.c -o filename.i
2.编译
将C语言代码编译成汇编代码
gcc -S filename.c -o filename.s
3.汇编
将汇编代码编译成二进制代码
gcc -c filename.c -o filename.o
4.链接
将二进制代码链接成可执行文件
gcc filename.c -o filename
GDB调试工具
1.语法错误
2.逻辑错误
gdb调试步骤:
1.编译时加入-g选项
gcc filename.c -g
2.使用gdb调试程序
gdb ./a.out
3.gdb调试命令:
l 查看代码
b main 设置断点
r 开始执行
n 单步执行
p 查看变量值
s 进入某段代码中
q 退出调试
1.先使用l
2.设置断点
3.运行程序
4.分步执行
5.查看某个变量的值
6.退出
C语言:
1.基本数据类型、运算符、表达式
2.输入输出函数
3.流程控制
4.数组
5.指针
6.函数
7.构造数据类型
8.指针高级
9.函数高级
10.内存管理
进制转换:
十进制:0 1 2 3 4 5 6 7 8 9
逢十进一
八进制:0 1 2 3 4 5 6 7
逢八进一
十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f
逢十六进一
二进制:0 1
逢二进一
二进制、八进制、十六进制 -> 十进制:
对应位 * 对应位的权值再求和
十进制 -> 二进制、八进制、十六进制:
十进制数除以进制数,得到的余数,逆序排列,则得到对应进制的数
十进制 -> 二进制转化:
八进制 -> 二进制转化:
八进制一位对应二进制的三位
十六进制 -> 二进制转化:
十六进制一位对应二进制的四位
C语言在不同平台执行结果可能不同
基本数据类型、运算符、表达式
man:Linux系统帮助手册
1.标准命令
2.系统调用
3.库函数
4.设备说明
5.文件格式
6.娱乐
7.杂项
8.管理员命令
基本数据类型:
数据类型:
1.基本数据类型 C语言能够直接识别的数据类型
1.整数类型
short
int
long
char
2.浮点数类型
float
double
3.缺省类型
void
4.泊尔类型
bool
2.构造数据类型 先定义才能够被C语言识别的数据类型
1.数组
2.结构体
3.共用体
4.枚举
1.整数类型:
sizeof:可以获得变量或者数据类型在内存中所占的字节空间
整数类型分为有符号类型和无符号类型:
short signed short unsigned short
int signed int unsigned int
long signed long unsigned long
char signed char unsigned char
默认为有符号类型
类型名称 内存空间中字节大小 值域范围
short 短整形 2个字节 unsigned short: 0 - 65535
signed short: -32768 - 32767
int 整形 4个字节 unsigned int: 0 - 2^32 -1
signed int: -2^31 - 2^31 - 1
long 长整型 4个字节 unsigned long: 0 - 2^32 -1
signed long: -2^31 - 2^31 - 1
char 字符型 1个字节 unsigned char: 0 - 255
signed char: -128 - 127
ASCII表:
字符与二进制数的转化关系
'a' -> 97
'b' -> 98
..
'A' -> 65
'B' -> 66
..
32号以后的字符能够在终端显示
32号之前的字符均用作通信控制,不能在终端显示(可能会显示出乱码)
补码:有符号数在内存中存放的为数字的补码
整数补码为该数本身
负数补码需 原码->反码->补码 得到对应内存中的数
32bit
数据总线 32根 == 4个字节
2.浮点数类型:
所有浮点数类型均为有符号类型:
float类型 单精度浮点型 4个字节
保存6位精度数据
符号位(1位)
指数位(8位)
尾数位(23位)
double类型 双精度浮点型 8个字节
保存15位精度数据
符号位(1位)
指数位(11位)
尾数位(52位)
3.缺省类型:
void
作为函数参数、函数返回值或修饰指针使用
4.逻辑类型:
bool _Bool
值域范围:
true(1) false(0)
在C语言中非0值表示逻辑真值,0值表示逻辑假值
变量和常量:
1.常量:
在程序运行过程中,不允许发生改变的量
1.整形常量(均为int类型,占4字节存储空间)
十进制常量
123
十六进制常量
0x123
八进制常量
0123
123l 长整型
123L 长整型
123ul 无符号长整型
123UL 无符号长整型
2.浮点型常量(默认double类型,占8个字节空间)
3.1415
31415.92
3.141592E4
3.141592E-4
3.141592e4
3.141592e-4
3.1415f float类型
3.字符常量
'a' 97
'b'
'A'
'#'
'!'
' ' 空格字符
'\n' 换行符
'\\' \字符
'\t' 横向制表符
'\v' 纵向制表符
'\b' 退格符
'\r' 回车符
'\a' 响铃
'\'' '符号
'0' 字符'0' 48
'1'
'2'
'\0' 字符'\0' 0
0 int 4 0000 0000 0000 0000 0000 0000 0000 0000
'0' char 1 0011 0000
'\056' 八进制56对应的字符
'\x41' 十六进制41对应的字符
4.字符串常量
5.标识常量
2.变量:
程序运行过程中,值可以改变的量
存储
变量定义一定会开辟内存空间
变量的定义:
存储类型 数据类型 变量名;
数据类型:
基本数据类型 short int long float double void bool
构造数据类型 struct union enum
存储类型:
auto 自动型变量、局部变量(默认)
register 寄存器变量
extern 外部变量
static 静态变量
变量名:
1.变量名可以由字母、数字、下划线构成不能以数字开头
2.变量名不允许与关键字重名
3.变量名最好不要与库函数重名
见名知意
驼峰法:
int iTmpNum;
short sTmpNum;
long lTmpNum;
unsigned int uiTmpNum;
unsigned short usTmpNum;
unsigned long ulTmpNum;
char cTmpNum;
变量的存储类型:
代码与变量分离
auto:自动型存储、局部存储
将变量存放在栈区
作用域:能够使用变量的范围
生存周期:变量从开始分配空间到空间被回收的整个过程
特性:
1.局部变量作用域在离定义该变量最近的一个大括号内可以使用
2.局部变量生存周期在程序执行变量定义时开辟空间,到作用域结束
回收变量空间
3.未经初始化前为随机值
注意:
不要使用未经初始化的局部变量
寄存器变量
将变量存放在CPU内部的寄存器中
如果寄存器中存满等价于auto类型
外部变量
声明:
声明一个变量是存在的,声明该变量的类型
定义:
定义需要开辟存储空间
静态变量
1.修饰静态变量,变量未经初始化为0值,
编译时分配空间
超过作用域范围不会被回收,程序结束回收空间
2.限定变量/函数的作用域
3.防止多文件编程时,变量名重名
变量初始化:
为变量开辟空间时,对空间赋初值即为初始化
int iTmpNum;
赋值:内存空间的拷贝
初始化 != 赋值
语句:
以;号结尾的一段代码
表达式:
由运算符连接的一个或者多个变量/常量组成的式子成为表达式
表达式一定有值
强制类型转换(显示类型转换)
double a;
(int)a;
隐式类型转化:
不同类型做数据运算和处理时,必须转化为同一种类型进行运算
所占空间越大,精度范围越高
unsigned > signed
浮点数 > 整数
高 double <- float
unsigned
long
低 int <- char short
运算符:
1.算数运算符
+
-
*
/
% 取余(不能对浮点数操作)
++ 自增运算符
i++ 先用再加
++i 先加再用
-- 自减运算符
float f = 10 / 4;
printf("f = %f\n", f);
练习:
定义两个变量,并对两个变量赋初值,计算这两个
变量四则运算结果并完成打印
int iNum = 0;
int i = 1;
//iNum = ++i+i++;
iNum = i+++i;
iNum ?
i ? 3
2.关系运算符
= 赋值运算符
== 关系运算符
> 小于
< 大于
== 等于
!= 不等于
>= 大于等于
<= 小于等于
3.逻辑运算符
&& 逻辑与 既..又..
|| 逻辑或 要么..要么..
! 逻辑非 真取非得假
假取非得真
逻辑与:
一假为假 全真为真
逻辑或:
一真为真 全假为假
逻辑非:
真取非得假 假取非得真
截断特性:
逻辑与左边为假值,右边不再计算
逻辑或左边为真值,右边不再计算
4.赋值运算符
=
+=
-=
*=
/=
..
数据截断:
大数据放入小空间,直接截取数据低位
数据扩展:
小数据放入大空间,有符号数高位扩展符号位
无符号数高位扩0
5.位运算符
& 按位与
| 按位或
~ 按位取反
>> 右移 缩小
右移n位缩小,除以2的n次方
<< 左移 放大
右移n位放大,乘以2的n次方
^ 按位异或 相同为0 相异为1
与0得0
或1置1
异或交换
将一个字节Num中的第n位置1的方法:
Num = Num | 1 << n
将一个字节Num中的第n为置0的方法:
Num = Num & ~(1 << n)
C语言中变量交换:
1.使用中间变量交换
t = a;
a = b;
b = t;
2.数学方法:
sum = a + b;
a = sum - a;
b = sum - b;
3.异或实现交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
6.特殊运算符(三目运算符)
7.逗号运算符
8.sizeof运算符