C语言简介:
C语言诞生于1970~1973年,丹尼斯.里奇和肯.汤普逊编写完成的,归属于美国的贝尔实验室
C语言专门为了编写操作系统而诞生的,因此天生适合对硬件编程,也非常适合数据结构和算法的实现,以速度快而著称
由于C语言出现时间早,有很多缺陷,也没想到普通人也能用C语言,因此虽然存在陷阱,但是一些前辈帮你总结好了经验<C语言的陷阱与缺陷>
虽然C语言自由度很高,但是也意味着危险,自由源于自律
C89 语法标准,gcc默认的语法标准
C99 是对C语言的扩展和增强 gcc code.c -std=gnu99
C11 全新升级
C语言的第一个程序
#include <stdio.h>
程序员所写的代码并不是标准C代码,需要一段程序把它翻译成标准C代码,负责翻译程序叫做预处理器,翻译的过程叫做预处理,被翻译的语句叫做预处理指令,以#开头的都是预处理指令
#include 把头文件导入到当前文件
#include <> 从系统指定目录下查找头文件并导入
#include “” 先从当前目录下查找,如果找不到再从系统指定目录下查找并导入
stdio.h 负责对输入输出的函数进行说明
.c 源文件 记录的都是功能性代码
.h 头文件 绝大多数记录的是函数的说明
stdlib.h string.h
int main()
{
printf("Hello World!\n");
return 0;
}
main函数:
函数是C语言管理代码的基本单位,一个函数就是一个功能的实现,就是一个代码段
main函数是程序的入口,也是唯一出口,有且只有一个
int 是一种数据类型,表示函数的返回值类型,是一个整数
return 作用:
1、返回一个返回值给调用者
2、结束函数的执行
main函数的调用者是操作系统,它的返回值返回给操作系统,反映了程序的是怎么样结束的:
正数 出现异常
0 正常结束
负数 出现错误
printf/scanf 属于C标准库中的函数,输入、输出数据
转义字符:
键盘上一些没有的符号,通过一些特殊的字符来表示
\n 换行符
\b 退一个字符
\r 回到行首
\a 铃响
\t 制表符
%% 一个%
\\ 一个\
C语言以分号作为一行代码的结束,使用大括号来划分代码
C语言代码变成可执行程序的过程:
预处理: 把源文件翻译成预处理文件
gcc -E code.c 把源文件预处理后的结果显示屏幕上
gcc -E code.c -o code.i ->code.i 生成以.i结尾的预处理文件
编译: 把预处理文件翻译成汇编文件
gcc -S code.i ->code.s 生成以.s结尾的汇编文件
汇编: 把汇编文件翻译成目标文件 (二进制)
gcc -c code.s ->code.o 生成以.o结尾的目标文件
链接: 把若干个目标文件合并成一个可执行文件 a.out
gcc a.o b.o c.o… ->a.out 生成a.out可执行文件
C文件类型:
.c 源文件
.h 头文件
.h.gch 头文件的编译结果
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件
存储空间的单位:
Bit 比特 存储一个二进制位,只能存0或1,计算机存储数据的最小单位
Byte 字节 八个二进制位,计算机存储数据的基本单位
Kb 1Kb=1024Byte
Mb 1Mb=1024Kb
Gb =1024Mb
Tb =1024Gb
Pb =1024Tb
数据类型
为什么要对数据进行分类?
1、在自然界中数据本来就是分类的
2、对数据进行分类可以节约空间,提高运行效率
C语言中把数据分为自建(程序员自己设计的类型,例如结构、联合、类)、内建(C语言自带的)
整型:
signed 有符号
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 正负20亿
signed long 4/8 正负20亿/以9开头正负19位数
signed long long 8 以9开头19位数
注意:signed 不加代表了加
unsigned 无符号
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~40亿
unsigned long 4/8
unsigned long long 8 0~以1开头的20位整数
注意:
由于定义无符号的数据比较麻烦,标准库中有头文件<stdint.h>把无符号的类型进行了重定义
uint8_t uint16_t uint32_t uint64_t
int8_t int16_t int32_t int64_t
浮点型:
float 4
double 8
long double 12/16
小数点后6位有效
模拟型
char 字符型:%c %hhd
所谓的字符就是符号或图案,在内存中是以整数形式存储的,需要显示字符时,会根据ASCII码表中的对应关系来显示出对应的符号或图案
0 '\0' 特殊字符
48 '0'
65 'A'
97 'a'
bool 布尔型:
先有的C语言才发明的bool类型,所以C语言没有真正的布尔类型,必须加上头文件<stdbool.h>才能使用
bool true 1 false 0
sizeof(unsigned int) 计算类型、变量所占的字节数
变量和常量:
什么是变量:
相当于存储数据的盒子,在程序运行期间数值可以发生改变
定义:
类型 变量名;
int num;
变量名的取名规则:
1、由字母、数字、下划线组成
2、不能以数字开头
3、不能与32个关键字重名 printf scanf sizeof bool
4、见名知意(功能、类型、范围)
注意:变量的值是随机的,为了安全起见,一般初始化为0
int num = 0;
使用:
赋值: num = 10;
参与运算 num*10
变量的输入输出:
int printf(const char *format, ...);
功能:输出数据
format:"双引号包含的提示信息+占位符"
...: 变量列表
返回值: 输出字符的个数
int scanf(const char *format, ...);
功能:输入数据
format:"双引号包含的占位符"
...: 变量地址列表 变量的地址 = &变量名
返回值:成功输入的数据的个数
练习2:通过scanf接受各种类型数据的值,并printf显示
类型占位符:
%hhd %hd %d %ld %lld
%hhu %hu %u %lu %llu
%f %lf %LF
%c
什么是常量:
程序运行期间数值不能发生改变的叫常量
100 默认int
100l long
100ll long long
100u unsigned int
100lu unsigned long
100llu
3.14 默认double
3.14f float
格式化的输出:
%nd 显示n个字符宽度,不足则补空格,右对齐
%-nd 显示n个字符宽度,不足则补空格,左对齐
%0nd 显示n个字符宽度,不足则补0,右对齐
%n.mf 显示n个字符宽度,不足补空格,m表示小数点后的位数
%g 不显示小数点后多余的0
运算符:
自变运算符 ++/-- 使变量的值自动加1或减1
前自变:立即有效
后自变:下一句语句才有效
注意:不要在一行代码内多次使用自变运算符
算术运算符: + - * / %
整除/整数 结果不能有小数点 10/3 3
/ % 除数不能为0,否则产生 浮点数例外,核心已转储的报错信息
一旦除零,程序直接死掉
关系运算符: > < >= <= == !=
运行后,得到的是比较的结果 1或者0,比较的结果是可以继续参与运算
int n=-100;
10<n<100; C语言中永远为真,规则跟数学中的不一样
if(100 == n)
{
}
逻辑运算符: && || !
会把运算对象转换为逻辑值,0转换为假,非0转换真
A && B 一假即假
A || B 一真即真
!A 求反
&& || 具有短路特性 当左边值可以确定整个表达式的结果时,右边的不再进行运算
三目运算符:运算对象有三个部分
A ? B : C; 判断A的值如果为真则执行B,如果为假则执行C
该语句不能使用流程控制语句,因为它必须要有运算的结果
赋值运