C语言中以分好作为一行代码的结束,使用大括号划分区域
编译器
负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成
gcc是由GNU社区为例编译Linux内核代码而开发的一款免费的编译器
gcc常用的编译参数:
-E 只显示预处理结果到终端
-std=gnu99 设置C99语法标准
-c 只编译不链接
-o 指定编译结果的名字 -oname -o name
-S 只生产汇编代码
-I 指定头文件的加载路径 -I 加 载路径
-wall 尽可能多的产生警告
-werror 把警告当错误处理
-l 指定要加载的代码库 -lm 可以使用数学库
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语言的文件类型
.c 源文件
.h 头文件(头文件的编译结果文件 .h.gch 它会被优先使用)
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件
存储空间的单位:
Bit 比特 一个二进制位,只能存储0或者1,计算机中存储数据的最小单位
Byte 字节 八个二进制位,计算机中存储器的存储容量的基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB
数据类型:
为什么要对数据进行分类?
1、现实生活中的数据本身就自带类别属性
2、对数据进行分类可以节约存储空间、提高运行速度
C语言中数据分类为两大类:自建(程序员自建设计的类型:结构、联合、类)和内建(C语言自带的类型)
注意:运算符sizeof可以计算类型、变量的字节数
整型:
signed 有符号
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 -2147483648~2147483647
signed long 4/8
signed long long 8 9开头的19位数
unsigned 无符号
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~4294967295
unsigned long 4/8
unsigned long long 8 0~1开头的20位数
注意:signed不加就代表了加
由于定义无符号整型时比较麻烦,C标准库把这些类型重定义成一些新的简单的类型名:需要导入头文件
uint8_t uint16_t uint32_t uint64_t
int8_t int16_t int32_t int64_t
浮点型: 有小数部分的类型
float 单精度 4
double 双精度 8
long double 12/16
注意:小数点后六位有效
注意:采用科学一定的算法对真实的浮点型数据到二进制数据进行转换,这个过程比存储、读取整型要慢得多,编程时尽量使用整型数据
double num;
if(num < 0.000001 && num > -0.000001);
模拟型:
字符型:char %c 打印字符
字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,会根据ASCII表中对应的关系显示出对应的字符或图案
48-'0' 65-'A' 97-'a' 0-' '(特殊字符)
布尔型:bool
先有C语言后有的bool类型,所以C语言中不可能有真正的布尔类型,在头文件
bool true false
变量和常量
什么是变量:程序运行期间数值可以发生变化的叫做变量,相当于一个存储数据的盒子
定义: 类型名 变量名;
int num;
取名规则:
1、由字母、数字、下划线_组成
2、不能以数字开头 _8_num8
3、不能与C语言32个关键字重名0
数据类型相关:
内建类型:
char short int long void float double 7
自建类型:
struct union enum sizeof 4
类型限定符:
auto const static volatile register typedef extern
signed unsigned 9
流程控制相关:
分支:
if else switch case default 5
循环:
for while do 3
跳转:
break continue return goto 4
4、见名知意(功能、类型、作用范围)
int sum_s_i
使用:
赋值:变量名 = 10;
num = 10;
参与运算: 2+(变量名*10);
2+(num*10);
注意:C语言中变量的初始值是随机的,为了安全起见,一般在定义时初始化为0
int num = 0; 初始化
num = 0; 赋值
变量的输出与输入:
int printf(const char *format, ...);
功能:输出数据
format:"双引号包含的提示信息+占位符"
...:变量名列表
返回值:输出字符个数
类型占位符:C语言中通过类型占位符传递变量的类型
signed %hhd %hd %d %ld %lld
unsigned %hhu %hu %u %lu %llu
float %f
double %lf
long double %LF
字符型 char %c
练习1:定义各种类型的变量并初始化,使用printf显示它们各自的值
int scanf(const char *format, ...);
功能:输入数据
format:"双引号包含的占位符"
...: 变量地址列表
返回值:成功输入的变量的个数
注意:scanf需要提供变量的地址
&变量名 == 变量地址
练习2:定义各种类型的变量并初始化,使用scanf输入,使用printf显示
什么是常量:程序运行期间数值不能改变的叫做常量
100 默认int
100l long
100ll long long
100u unsigned int
100lu unsigned long
100llu unsigned long long
3.14 默认double
3.14f float
3.14l long double
#define SEC 3600*24*365*100u
格式化输入和输出
%nd 显示n个字符宽度,不够则补充空格,右对齐
%-nd 显示n个字符宽度,不够则补充空格,左对齐
%0nd 显示n个字符宽度,不够则补0,右对齐
%n.mf 显示n个字符宽度(小数点也算一位),不够则补充空格,m表示小数点后几位(四舍五入,不够补0),右对齐
%g 不显示小数点后多余的0
运算符:
自变运算符:++/-- 使变量的值自动加1货减1
前自变:++num/--num 立即生效
后自变:num++/num-- 下一行语句才有效
注意:一行代码内不要使用多次自变运算符
算数运算符: + - * / %(求余)
整数/整数 结果还是整数,没有小数点,只保留整数部分
10/3 -> 3
10%3 -> 1
/ % 除数不能为0,否则就会浮点数例外,(核心已转储),(用了除0后的结果才会出现),这个是运行报错,一旦产生程序立即停止,后面不在执行
关系运算符: > < >= <= == !=
比较结果0(不成立)或1(成立),比较结果可以继续参与后续的运算
int n = -100;
if(10 < n < 100); 结果永远为真,与数学运算规则不同
注意: == 建议常量放左边
逻辑运算符: && || !
先把运算对象转换成逻辑值,0转换为假,非0是转换为真
A && B 一假即假 A || B 一真即真 !A 求反、
&& || 短路特性:
当左边部分的值可以确定整个表达式的结果时,右边部分就不执行计算
三目运算符:运算对象有三个部分
A ? B : C 判断A的值如果为真则执行B,否则执行C
赋值运算符:
a = 10;
a += 10; a=a+10
a -= 10;
a *= 10;
a /= 10;
a %= 10;
位运算符: & | ~ ^ << >>
运算符优先级:单目,双目,三目
分支语句
单分支
if(表达式) //单分支
{
//表达式为真(非0),则执行此处代码
}
双分支
if(表达式) //双分支
{
//表达式为真(非0),则执行此处代码
}
else
{
//表达式为假,则执行此处代码
}
多分支
if(表达式1) //多分支
{
//表达式为真(非0),则执行此处代码
}
else if(表达式2)
{
//表达式2为真,则执行此处代码
}
else if(表达式3)
{
//表达式3为真,则执行此处代码
}
...
else
{
//如果以上所有表达式都为假,则最后执行此处代码
}
1、输入三个整数,从小到大显示
2、输入一个年份,判断是否闰年 四闰百不闰,四百闰
3、输入一个年份和月份,判断该月有多少天
4、输入一个成绩,判断等级
[90-100]A [80-89]B[70-79]C[60-69]D[0-59]E other成绩有误



