C语言学习笔记第二天
-
编译器
负责把人能看懂的记录着代码的文件,翻译成计算机能看懂的二进制文件,由预处理器,编译器,链接器组成
gcc 是由GNU社区为了编译Linux内核代码内核二开发的一款免费的编译器
gcc编译代码格式:
gcc 编译参数 filename
gcc常用的编译参数(放在gcc后面使用):
-E 只显示预处理的结果到终端 -std=gnu99 设置为c99的语法标准 -c 只编译不链接 -o 指定编译结果的名字 -s 只生成汇编代码 -I 指定头文件的加载路径 -Wall 尽可能多的生成警告 -Werror 把警告当成错误处理 通常和-Wall联合使用 -l 指定要加载的代码库 如:-lm 加载数学库 注:
-
-o有两种写法:1、-oname 2、-o name
-
最上面那个I是大写的i,下面那个l是小写的L
-
-
C代码编程可执行文件的详细过程
-
预处理 把源文件翻译成预处理文件
gcc -E hello.c 显示预处理结果到终端
gcc -E hello.c -o hello.i 生成以.i文件结尾的预处理文件
-
编译 把预处理文件翻译成汇编文件
gcc -S hello.i生成以.s结尾的二进制的目标文件
-
汇编 把汇编文件翻译成二进制的目标文件
gcc -c hello.s 生成以.o结尾的目标文件
-
链接 把若干个目标文件合并成一个可执行文件
gcc hello.o默认生成a.out可执行文件
-
-
C语言的文件类型
.c 源文件 .h 头文件 .h.gch 头文件的编译结果文件,它会被优先使用 .i 预处理文件 .s 汇编文件 .o 目标文件 .a 静态库文件 .so 共享库文件 -
存储空间的单位
-
Bit 比特 一个二进制位,只能存储0或者1,计算机中存储数据的最小单位
-
Byte 字节 八个二进制位,计算机存储器的存储容量的最小单位
-
KB MB GB TB PB 换算为1024:1
-
-
数据类型
为什么要对数据进行分类?
1、现实生活中的数据本身就自带类别属性
2、对数据进行分类可以节约存储空间、提高程序的运行速度
C语言中数据类型分类为两大类:自建(程序员自己设计的类型:结构、联合、类)和内建(C语言自带的类型)
注意sizeof可以计算类型、变量的字节数
整形:signed有符号整数 (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位整数 |
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位整数 |
由于定义无符号整形时比较麻烦, c标准库把这些类型重定义成为一些新的简单的类型名:
需要导入头文件<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
注意:小数点后六位有效
判断浮点数是否为零
double num;
if(num<0.000001 && num>-0.000001)
num=0;
采用一定的算法对真实的浮点型数据到二进制数据进行转化,这个过程比储存、读取数据要慢得多,编程时尽量使用整形数据
模拟型:
字符型:char
字符就是符号或者图案,在内存中储存的依然是整数,需要显示出字符时会根据出字符时,会根 据ASCALL表中对应的关系显示出对应的字符或图案
‘\0’ 0 特殊字符
‘0’ 48
‘A’ 65
‘a’ 97
布尔型:bool
先有的c语言后有的bool类型,所以C语言中不可能有真正的布尔类型,在头文件stdbool.h中
-
变量与常量
什么是变量:程序运行期间数值可以发生变化的叫做变量,相当于一个储存数据的盒子
定义: 类型名 变量名;
int num
取名规则:
- 1、由字母、数字、下划线组成 - 2、不能以数字开头 - 3、不能与C语言的32个关键字重名 - 4、见名知意(功能、类型、作用范围……)
-
变量的输入与输出
类型占位符:表示传递变量的类型
signed char signed short signed int signed long signed long long %hhd %hd %d %ld %lld unsigned char unsigned short unsigned int unsigned long unsigned long long %hhu %hu %u %lu %llu float double long double char %f %lf %llf %c 练习1:定义各种类型的变量并初始化,使用printf显示他们各自的值
int scanf(const char *format,...);
功能:输入数据
format:”双引号包含的占位符“
… :变量地址列表
返回值:成功输入的变量的个数
注意:scanf需要提供变量的地址
&变量名 ==变量地址
练习2:第一各种类型的变量并初始化为0,使用scanf输入,使用printf显示
什么是常量:程序运行期间数值不能改变的叫做常量
数据 | 类型 |
---|---|
100l | long类型(注意100后面是小写的L |
100 | 默认int类型 |
100ll | long long类型 |
100u | unsigned int |
100lu | unsigned long |
100llu | unsigned long long |
3.14 | 默认double |
3.14f | float |
3.14l | long double |
格式 | 作用 |
---|---|
%nd | 显示n个字符宽度,不够则补充空格,右对齐 |
%-nd | 显示n个字符宽度,不够则补充空格,左对齐 |
%0nd | 显示n个字符宽度,不够则补充0,右对齐 |
%n.mf | 显示n个字符宽度(小数点也算一位),不够则补充空格,m表示小数点后几位,不够补零,四舍五入 |
%g | 不显示小数点后多余的零 |
-
自变运算符
++/-- 使变量的值自动加一或者减一
前自变 立即生效
后自变 下一句语句生效
注意不要在一行代码中多次使用自变运算符
-
算数运算符
/ * + -
整数/整数 结果还是整数,没有小数点,只保留整数部分
10/3 3
10%3 1
除数不能为0,否则报错,就算是编译的时候没有报错,运行的时候也会报错的
-
关系运算符
< > >= <= == !=
结果为0或者1,结果可以继续参与后续运算
-
逻辑运算符
&& || !
先把运算对象转换为逻辑值,0转换为假,非零转换为真
运算 功能 A&&B 一假即假 A||B 一真即真 !A 求反
&& 和||运算符有一个短路特性:当左边的只可以确定整个表达式的结果时,右边部分就不执行计算
-
赋值运算符
a = 10;
a += 10;
a *= 10;
a /= 10;
a %= 10;
-
三目运算符
A?B:C 判断A的值如果为真则执行B,否则执行C
-
位运算符
& ^ | << >>