C语言学习笔记(1)——输入输出,数据类型

一,编译原理

C语言编译分为四个步骤:预编译/预处理→编译→汇编→链接

1.预编译/预处理:对源代码进行初步文本处理,包括宏定义展开,文件的包含,注释删除,条件编译等 xxx.c-xxx.i
2.编译:检查语法错误,若没有错误就将其编译为汇编语言文件(汇编文件) xxx.i-xxx.s
3.汇编:将汇编文件转换为目标文件(二进制文件) xxx.s-xxx.o

4.链接:将一个或多个目标文件(.o)以及库文件合并成最终可执行的文件

二、输入输出函数

2.1 printf函数

函数原型:int printf( const char *format, ... );

函数功能:printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中

用法一:printf("字符串\n");

用法二:printf("字符串+格式控制符\n",输出参数);

用法三:printf("格式控制符1+格式字符串2\n",输出参数1,输出参数2);

宽度与精度控制:

1.宽度说明符控制实际的输出宽度

2.精度说明符控制实际的输出精度(小数点后几位)

3.%-f 或 %f:%号后面的正负决定输出是左对齐还是右对齐,整数表示宽度,小数部分表示精度

2.2 scanf函数

函数原型:int scanf( const char *format, ... );

函数功能:scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数

用法一:scanf("字符串+格式控制符",地址表)

用法二:scanf("格式控制符1 格式控制符2",地址表1,地址表2);

注意:scanf函数双引号内除了格式控制符之外都要原样输入

%d格式控制符只能识别0-9,+ -(正负号),%d,%i,%f,%lf,%u,%o,%s,%x会跳过前导空白字符(包括空格、制表符、换行符)

注意:scanf 函数始终从输入缓冲区读取数据。如果缓冲区中有符合 format 格式的数据,就直接提取并赋给变量;如果缓冲区为空或数据不符合格式,会根据情况等待用户输入或立即返回失败。成功读取的数据会从缓冲区移除,失败时问题数据保留在缓冲区中。

2.3 getc与putc函数

函数原型:int getc(FILE *stream);

函数功能:从指定的文件流中读取一个字符
返回值:返回读取的字符(转换为 int 类型),如果到达文件末尾或发生错误,返回 EOF
函数原型:int putc(int char, FILE *stream);

函数功能:将一个字符写入指定的文件流

函数参数:参数 char 是要写入的字符(作为 int 传递)

返回值:返回写入的字符,如果发生错误返回 EOF

2.4 getchar与putchar函数

函数原型:int getchar(void);等价于 getc(stdin)

函数功能:从标准输入(stdin)读取一个字符

返回值:返回读取的字符(转换为 int 类型),如果到达文件末尾或发生错误,返回 EOF
函数原型:int putchar(int char);等价于 putc(char, stdout)

函数功能:将一个字符写入标准输出(stdout)

函数参数: char 是要写入的字符(作为 int 传递)

返回值:返回写入的字符,如果发生错误返回 EOF

2.5 fprintf与sprintf函数

函数原型:int fprintf(FILE *stream, const char *format, ...);

函数功能:将格式化数据写入指定的文件流
函数原型:int sprintf(char *str, const char *format, ...);

函数功能:不直接输出到屏幕或文件,而是存储到字符数组中

三、缓冲区

为什么引入缓冲区?

当高速设备与低速设备不匹配时,势必会让高速设备花时间等待低速设备,可以在这两者之间设立一个缓冲区。

作用一:可以解除两者的制约关系,数据可以直接送往缓冲区,高速设备不用再等待低速设备,提高了计算机的效率

作用二:可以减少数据的读写次数,如果每次数据只传输一点数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。

缓冲区刷新条件

1.缓冲区满:当缓冲区满时,会自动刷新

2.遇到换行符(对于行缓冲区):例如,标准输出(stdout)是行缓冲的,所以遇到'\n'时会刷新

3.手动刷新:使用fflush函数强制刷新缓冲区

4.程序正常结束:当main函数返回或调用exit时,所有打开的输出流会被刷新

5.关闭文件:当使用fclose关闭文件时,缓冲区会被刷新

6.从无缓冲流中读取:如果从无缓冲流中读取,则所有输出流会被刷新(这取决于实现)

7.从行缓冲流中读取:如果从行缓冲流中读取,则该流会被刷新(例如,从stdin读取时,会刷新stdout)
注意:标准错误流(stderr)通常是无缓冲的,这样错误信息可以立即显示

四、数据类型

4.1 关键字

①数据类型关键字:char short int float double long signed unsigned struct enum union void typedef volatile

基本数据类型:char short int long float double

派生类型:struct enum union

类型修饰符:signed unsigned

空修饰符:void

②控制语句关键字

选择结构:if-else switch-case-default

循环结构:for while do continue goto return break

③与存储类关键字

auto static extern const register

④运算符关键字

sizeof

作用:

auto:所有局部变量默认就是auto的

static:局部变量:保持值的持久性,只在第一次初始化

全局变量/函数:限制作用域为当前文件

extern:声明在其他文件中定义的全局变量或函数,用于多文件编程

const:定义只读变量,防止意外修改

register:建议编译器将变量存储在寄存器中(很少用)

volatile:告诉编译器变量可能被意外修改,防止编译器进行优化

变量名命名规则:①不能和关键字重名;②只能是数值,字母,下划线,美元符$;③第一个字符不能为数字

4.2 地址概述

CPU的位数主要决定了其通用寄存器的宽度,这直接影响CPU单次操作能处理的数据量和理论上能直接寻址的内存空间范围,但实际实现可能受地址总线宽度、操作系统和硬件架构的影响

4.3 大小端模式

4.4 存储原理

4.4.1 整形数据

整形数据是以补码的形式存储在内存当中

①如果数据为正数:原码 = 反码 = 补码

②如果数据为负数:反码 = 原码按位取反(除去符号位),补码 = 反码+1

4.4.2 浮点型数据

float:单精度浮点数(精确到小数点后6位)

double:双精度浮点数(精确到小数点后15位)

4.4.3 字符型数据

字符变量用来存储单个字符,在C语言中用char表示,其中每个字符占用一个字节。再给字符型变量赋值是,需要用一对英文半角格式的单引号('')将字符括起来

字符变量实际上并不是将字符本身放在变量的内存单元中,而是将字符对应ASCII编码放到变量的存储单元中。Char本质上就是一个字节大小的整形。

4.5 转义字符

|--------------------------------|---------------------|-------|
| 转义字符 | 含义 | ASCII |
| \a | 警报 | 7 |
| \b | 退格(BS),当前位置移到前一列 | 8 |
| \f | 换页(FF),将当前位置移到下页开头 | 12 |
| \n | 换行(LF),将当前位置移到下一行开头 | 10 |
| \r | 回车(CR),将当前位置移到本行开头 | 13 |
| \t | 水平制表符(HT),调到下一个tab | 9 |
| \v | 垂直制表符(VT) | 11 |
| \0 | 数字0 | 0 |
| \ + 1-3位八进制数字(0-7) | 8进制的转义字符(\123→S) | |
| \x + 1-n位十六进制数字(0-9,A-F,a-f) | 16进制转义字符(\41→A) | |

相关推荐
长安第一美人18 分钟前
C 语言可变参数(...)实战:从 logger_print 到通用日志函数
c语言·开发语言·嵌入式硬件·日志·工业应用开发
Larry_Yanan22 分钟前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
superman超哥36 分钟前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
不爱吃糖的程序媛1 小时前
Ascend C开发工具包(asc-devkit)技术解读
c语言·开发语言
做cv的小昊2 小时前
【TJU】信息检索与分析课程笔记和练习(1)认识文献
经验分享·笔记·学习·搜索引擎·全文检索
李绍熹2 小时前
c语言字符串操作示例
c语言
Damon_X2 小时前
extern “C“
c语言
读创商闻2 小时前
崇明岛西滩湿地:离都市最近的候鸟观测笔记
笔记
再睡一夏就好2 小时前
深入Linux线程:从轻量级进程到双TCB架构
linux·运维·服务器·c++·学习·架构·线程
蒙奇D索大3 小时前
【11408学习记录】考研英语长难句拆解三步法:三步拆解2020年真题,攻克阅读难点
笔记·学习·考研·改行学it