C语言简介:
BCPL->newB->C->UNIX->Minix->Linux->gcc
C语言诞生于1970 -
1973年,在肯.汤普逊和丹尼斯.里奇的主导编写下完成,归属于美国贝尔实验室。 C语言专门为了编写操作系统而诞生的语言,所以天生适合硬件编程,以运行速度快而著称,也非常适合实现数据结构与算法。 由于出现的时间过早,C语言是存在非常多的缺陷,也没想到普通人也能使用C语言编程,因此就存在陷阱,但是前辈们都总结了一些避免的经验《C语言的陷阱与缺陷》C语言三剑客。 C语言的语法很自由,也意味着危险,自由源于自律
C89语言标准,gcc默认的语法标准 C99语法标准,对C89标准的扩展和增强 -std = gnu99 C11语法标准,全新的升级
一、第一个C程序
#include <stdio.h> 程序员所写的代码并不是标准的C代码,需要一段程序把它翻译成标准的C代码,负责翻译的程序叫做预处理器,翻译的过程叫做预处理,被翻译的语句叫做预处理指令。 #include 的功能是把一个头文件导入到当前文件中 #include <> 从系统的路径下加载头文件 #include "" 先从当前路径下加载头文件,如果找不到再从系统指定的路径下加载头文件 操作系统是通过设置环境变量来指定下载头文件的路径 stdio.h 头文件:以.h结尾。里面存储的是一些辅助性代码,绝大部分是函数的声明 源文件:以.c结尾,里面存储的是功能性的代码 C语言标准委员会为C语言以函数形式提供了一些基础功能,这些函数被封装到了libc.so库中 用很多头文件负责对库中的头文件继续分类说明,stdio.h就是其中的一个,常用的还有stdlib.h string.h stdio.h 负责对输入输出功能的函数进行说明 int main(int argc, const char *argv[]) { printf("hallo world!\n"); return 0; } main函数:function C语言以函数为单位来管理代码,是管理代码的最小单位,一个函数就是一段具有某项功能的代码段 main 函数是程序的执行入口,有且只有一个 int 是一种数据类型,它表示main函数的执行结果是一个整数 return 功能有两个:1、结束函数的执行 2、返回一个数据给函数 main函数是有操作系统调用,它的返回值给操作系统的,反映了程序是怎么样结束的,通常有三种情况: 正数 出现异常 (别人的错误) 0 一切正常 负数 出现错误 (自己的错误) 可以通过 echo $? 命令查看上一个程序的返回值 printf/scanf 是标准库中的函数,负载输出/输入数据,一般用来调试代码 //printf("--------\n"); 转义字符: 键盘上一些特殊的按键是没有符号的,用一些特殊的字符组合来表示,这些特殊的字符组合就是转义字符,\n就是其中一个 \n 换行 \b 退一个字符 // \b \b \r 回到行首 \t 制表符,用于对其数据 \a 铃响 \\ 表示一个\ %% 表示一个% C语言以分号作为一行代码的结束,使用大括号划分代码区域
二、编译器
负责把人能看得懂的记录了代码的文本文件,翻译成计算机能看懂的二进制文件,由预处理器、编译器、连接器
gcc是由GNU组织为了编译Linux内核的代码而开发的一款免费、开源的编译器,默认采用C89标准,-std = gun99 可以设置语法标准
常用参数: -E 显示预处理的结果 -c 只编译不连接 -o 设置编译结果的名字 -I 指定头文件的加载路径 -S 生成汇编代码 -l 指定要使用的库文件 -lm -Wall 以跟严格的方式检查代码,尽可能多的显示警告 -Werror 把警告当做错误处理
三、C代码变成可执行程序的过程
1、预处理 把源文件翻译成预处理文件
//gcc -E code.c 显示预处理的结果
//gcc -E code.c -o code.i 生成以.i结尾的预处理文件
2、编译 把预处理文件翻译成汇编文件 //gcc -S code.i 生成以.s结尾的汇编文件 3、汇编 把汇编文件翻译成二进制的目标文件 //gcc -c code.s 生成以.o结尾的目标文件 4、连接 把若干个目标文件合并成一个可执行文件 //gcc a.o b.o c.o 默认生成一个a.out的可执行文件 C语言的文件类型: .h 头文件 .h.gch 头文件的编译结果,他会被优先使用 .c 源文件 .i 预处理文件 .s 汇编文件 .o 目标文件 .a 静态库文件 .so 共享库文件
四、数据类型
为什么要对数据进行分类?
1、现实社会中的数据就是自带类别属性
2、对数据进行分类可以节约存储空间、提高运行效率
存储空间的单位: Bit 比特 一个二进制位,只能存储0或者1,计算机存储数据的最小单位 Byte 字节 八个二进制位,计算机存储数据的基本单位 Kb 1024B Mb 1024Kb Gb 1024Mb Tb 1024Gb Pb 1024Tb C语言中数据分为两大类:自建(程序员自己设计的:结构、联合、类)和内建(C语言自带的) 注意:可以使用sizeof运算符计算类型的字节数 整型: 有符号:signed signed char 1 -128~127 signed short 2 -32768~32767 signed int 4 正负20亿 signed long 4/8 signed long long 8 正负9开头19位整数 注意:signed 不加就代表加 无符号:unsigned unsigned char 1 -128~128 unsigned short 2 -32768~32768 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 注意:采用科学计算方法,二进制与真实数据之间需要进行换算,一次浮点型数据耗时要比整型数据多得多,编程时尽量选择整型 小数点后六位有效 time ./a.out 计算运行时间 模拟型: 字符型char 字符其实就是符号或图案,内存中存储的是整数,当需要显示成字符时会根据ASCII码表中对应的关系显示出相应的符号或图案 '/0' 0 '0' 48 'A' 65 'a' 97 布尔型bool 现有C语言之后才有了bool类型,所以C语言中没有真正的bool类型,stdbool.h头文件对布尔类型进行了模拟 bool true false
五、变量与常量
什么是变量:程序在运行期间数据可以变化的叫做变量,相当于存储数据的盒子
定义:
类型 变量名;
取名规则:
1、由字母、数字、下划线组成
2、不能以数字开头
3、不能与32个C语言的关键词重名
4、见名知意(功能、类型、范围...)
printf scanf bool sizeof
使用: 赋值: num=100; 参与运算: num*10; 注意:在C语言中,变量的默认值是随机的,为了安全起见要进行初始化,一般初始化为0 变量的输入、输出; int printf(const char *format, ...); 功能:输出数据 format:"双引号包含的格式信息(信息提示+占位符)" ... :变量列表 返回值:输出字符的个数 类型占位符:C语言通过类型占位符的方式来传递变量的类型 %hhd %hd %d %ld %lld 有符号 char short int long long long %hhu %hu %u %lu %llu 无符号 %f %lf %LF %c %s 练习1:通过定义各种类型的变量并初始化,使用printf来显示 int num_i = 0; printf("num=%d %d\n",num_i,num_i); int scanf(const char *format, ...); 功能:输入数据 format:"双引号包含的格式信息(占位符)" ... : 变量地址列表 返回值: 成功输入的变量个数 注意:scanf需要的是变量类型、变量地址 变量地址 = &变量名 练习:定义各种类型的变量并初始化,使用scanf输入,printf输出