一、32个关键字
1、数据类型
void 无类型,用于函数返回值、参数、指针
unsigned signed 整型的类型说明
char short int long 整数类型
float double 浮点型
struct union enum 结构、联合、枚举
auto 自动创建、销毁
const 常量
static 静态的变量
register 寄存器
volatile 易变的、不稳定的
extern 变量或函数声明
typedef 类型重定义
sizeof 字节数计算
流程控制
if else switch case break default
for while do continue
goto return
2、运算符
算术运算符:+ - * / %
关系运算符:> < >= <= == !=
逻辑运算符:&& || !
自变运算符:++/–
赋值运算符:= += -= *= /= …
三目运算符:a?b:c;
位运算符:& | ~ ^ << >>
3、在任何系统里都能正常运行的最初的程序(上周思考题的答案)
hello world
#include <stdio.h>
int main(int argc,char const * argv[])
{
printf("hello world!\n");
return 0;
}
二、第一个C程序
程序员所编写的C代码,不是标准的,它需要被一段翻译成标准的能被继续编译。
负责翻译的程序叫预处理器,被翻译的指令叫预处理指令(以#开头),翻译的过程叫预处理。
gcc -E hello.c 会输出预处理的结果到屏幕上。
gcc -E hello.c -o hello.i 把预处理的结果保存到文件中。
#include 把一个文件导入当前文件中
<> 根据系统指定目录来搜索并加载头文件
“” 优先从当前目录加载头文件,如果没有再从统指定目录来搜索并加载头文件。
C语言标准委员会给C语言以函数形式提供了些基础功能,这些函数被封装在标准库,libc.so。
standard input output
#include <stdio.h>
C语言文件类型分类:
.c 源文件,里面记录的是主要的功能代码。
.h 源文件的辅助文件,用于说明源文件中有哪些变量、函数,以及它们的格式。
.i 预处理后文件,是由.c变成的
.s 汇编文件,由.i变成的
.o 目标文件,由.s变成的
.out 可执行文件,由若干个.o合并成的。
int main(int argc,char const * argv[])
C语言中以函数(具有某项功能的代码段)为管理代码的最小单位(库、模块、文件、函数)
main函数是C语言的入口函数,有且只能有一个,当运行程序时会被"操作系统"自动调用。
返回值类型 函数名(参数列表)
函数体
return 数据;
argc、argv是main函数执行时需要的参数,由操作系统提供。
int 表示main执行完成后会有一个int类型的结果返回给调用者(操作系统)。
return 会终止函数的执行,然后把一个数据返回给函数的调用都。
main函数的返回值:
0 表示一切正常
负值 表示出现错误
正值 表示出现异常
printf("hello world!\n");
printf是标准库中用于输出数据的函数。
参数:它需要两部分参数(格式+数据),参数的数量可以不固定。
返回值:成功显示的字符数量
scanf是标准库中用于输入的函数。
参数:它需要两部分参数(格式+地址),参数的数量可以不固定。
返回值:成功输入的数据的数量
printf、scanf是用来调试程序用的,printf用于模拟向界面显示数据,scanf用来模拟从界面获取数据。
\n 是转义字符的其中一个,不能正常显示的符号。
\n 回车
\r 回行首 功能类似home键
\b 退格,功能类似Backspace
\a 铃响,用于产生警告
\ 输出
%% 输出 %
二、C代码是如何变成可执行程序的
1、编辑:使用vim等文件编辑器编写代码
vim hello.c
2、预处理:把程序员所编译代码翻译成标准C代码。
gcc -E hello.c -o hello.i 生成以.i结尾的预处理文件
3、编译:把标准的C代码翻译成汇编代码。
gcc -S hello.i 生成以.s结尾的汇编文件
4、汇编:把汇编文件翻译成目标文件
gcc -c hello.s 生成以.o结尾的目标文件
5、链接:把若干个标文件合并成一个可执行文件
gcc a.o b.o c.o 生成一个可执行程序,默认叫a.out
可以通过 -o 来设置可执行文件的名字。
6、加载:./a.out 从硬盘加载内核
三、GNU编译器
GNU是一个开源组织,负责维护Linux系统内核的源码,GNU编译器是GNU社区专门为编译Linux系统而开发一款编译器。
编译器是由很多个不同功能程序组成的:预处理器、编译器、链接器等。
gcc编译器常用的参数:
-E -S -c -o
-Wall 以更严格的标准来检查代码
-Werror 把警告当错误处理
-g 加入调试信息,gdb
-O 编译代码时的优化级别
-D 编译时定义宏
-std 指定编译标准 -std=gnu99
四、数据类型
为什么要对数据进行类型分类?
节约存储空间,提高计算速度。
内建:
整型:
有符号:它的最高位的二进制用来表示正负,这叫做符号位。
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 -2147483648~2147483647 (十位数)
signed long 4/8 -9223372036854775808~9223372036854775807(十九位数)
注意:signed 不加就代表加;
无符号:它所有的二进制位都用来表示数据。
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~4294967295
unsigned long 4/8 0~18446744073709551615(二十位数)
注意:定义无符号数据时,unsigned必不可少,而标准库(stdint.h)为我们使用方便对它们做重定义。
uin8_t、uint16_t、uint32_t、uint64_t
浮点型:
单精度:float 4
双精度:double 8
高精度:long double 12/16
注意:浮点型数据在内存中以科学计算法来表示,有特殊的格式,与整型相比计算速度比较慢慢,没有特殊要求不建议使用。
注意:小数点后六位有效。
如何判断浮点型数据是否是“零值”
0.000001 > f && f > -0.000001
自建:
结构struct、联合union、枚举enum
模拟:
字符型:所以谓的字符就是由于像素组成的图案,真正内存中是以整数形式存储。
当需要显示字符时按照ASCII中的对应关系显示,符号。
‘0’ 48
‘a’ 97
‘A’ 65
char %c 显示字符
注意:字符型里面存储的就是整数,是计算机把它翻译成的字符。
布尔型:可以认为是先有C语言后有的布尔类型,C语言中没有布尔类型。
在代码包含 stdbool.h 头文件,就可以使用布尔类型。
bool true false(值是4个字节);
其它整型可以自动转换成布尔类型,0转换成假false,非0转换成真true。
五、常量与变量
常量:程序在运行过程中不能改变的数据,字面值常量、宏常量、枚举常量。
10 默认是int类型
3.14 默认是double类型
100u8 unsigned char
100u unsigned short
100U unsigned int
100l unsigned long
1.0f float
1.0L long double
变量:存储数据的盒子(容器),需要先定义后使用。
定义:数据类型 变量名;
int num;
注意:变量的默认值是不确定的,为了安全要初始化一下。
定义变量其实就系统给变量名分配块内存,但并不清理这块内存,内存大小由数据类型决定。
变量名的取名规则:
1、由数字、字母、下划线组成。
2、不能以数字开头。
3、不能与关键字重名。
4、长度不要超过30。
5、见名知意(功能、类型、身份、范围)
使用:
被赋值:num = 10;
参与运算:num*100+300
变量的输入输出:
变量使用printf进入输出:
printf 类型 变量名
%hhd %hd %d %ld
%hhu %hu %u %lu
%f %lf %LF
%g 不显示多余零
%.nf 设置小数点后面的位数
%md 设置数据的显示宽度,默认补空格
%0md 设置数据的显示宽度,不够补0
%-md 设置左对齐,默认补空格
printf既可以输出变量的值,也可以输入一些提示信息,提高程序的体验度。
练习1:定义各种类型的变量,并初始化,
使用printf显示变量的值。
输入变量的值:
变量使用scanf进入输入:
scanf 类型 变量的地址(跟指针有关)。
注意:&变量名 得到变量的地址
注意:scanf中除占位符,其它一切都不要加,尤其是\n千万不能加。
练习2:定义各种类型的变量,使用scanf从键盘输入各个变量的值。
然后再使用printf显示变量的值。