公司动态

C语言中的变量常量及输入输出函数

📅 2026/7/17 6:47:23
C语言中的变量常量及输入输出函数
一变量1.变量的概念1变量是用来存储数据的被命名的内存位置2变量需要用一个有名字的、具有特定属性的存储单元来存放数据3变量必须先定义后使用或先声明后使用定义时指定名字和类型也可以指定初值2.变量的定义和分类存储类型 数据类型 变量名 初始值1存储类型说明符用于控制变量的存储位置、生命周期和作用域。auto:局部变量默认关键字只能用于函数内或块内static:声明为静态变量生命周期为整个程序但是作用域受限extern:声明为外部变量全局变量的默认存储类型register:建议编译器将变量存储在寄存器中以提高访问速度typedef:用于定义类型2数据类型说明符用于定义变量或函数的基本数据类型。int:整数类型4个字节signed:有符号整型unsighed:无符号整型short:短整型2个字节char:字符类型1个字节long:长整型4个字节float:浮点型4个字节double:双精度浮点型8个字节bool:布尔类型void:空类型声明函数无返回值或无参数或未定义指针类型3.变量的命名规则1只能由字母包括大写和小写、数字和下划线_组成2必须以字母或下划线开头不能以数字开头3长度不超过63个字符4变量名区分大小写5变量名不能使用关键字4.在C语言中自动变量通常是局部变量的生命周期从函数或代码块开始时创建到函数或代码块结束时销毁。5.在C语言中如何声明一个常量变量在C语言中使用const关键字来声明常量变量格式为const 类型 变量名 值。6.介绍C语言中static关键字的作用。1static修饰局部变量**局部变量的生命周期得到延长。**局部变量默认是程序运行的时候在栈中分配空间的这样在函数结束时局部变量对应的内存已经被释放了。当用static修饰局部变量时static修饰的局部变量在分配的空间在静态区区域data/bss段这样的局部变量不会在函数调用结束的时候把对应的空间释放掉。**局部变量值得以保留不论函数调用多少次局部变量只初始化一次。**局部变量如果没有赋初始值的时候默认值为随机值程序运行的时候在栈中开辟空间此时分配内存中存放的值无法确定。static修饰的局部变量默认值为0并且这个变量的值具有继承性每次调用的时候static修饰的变量不会每次重新赋值而是接着使用上一次的值。2static修饰函数/全局变量static修饰的函数/全局变量的作用范围被限制在本文件中默认情况下函数名或全局变量是全局可见的在头文件中经常使用extern声明但当使用static修饰它们的时候暗示该函数/变量只是在本文件中有效就不能在头文件中用extern关键声明。7.原码补码反码1原码符号位加上真值的绝对值即用第一位表示符号其余位表示值。原码是人脑最容易理解和计算的表示方式。2反码.正数的反码是其本身负数的反码是在其原码的基础上符号位不变其余各个位取反。计算溢出的进位需要加到最低位3补码正数的补码就是其本身负数的补码是在其原码的基础上符号位不变其余各位取反最后1(也即在反码的基础上1)。补码计算机中最常用的负数表示方式因为它具有简化运算的优点。8.整型变量分类修饰符类型占用空间取值范围signedshort(int)2个字节-32768(-2¹⁵)~32767(2¹⁵-1)unsignedshort(int)2个字节0~65535( 2¹⁶-1)signedint一般4个字节-2147483648(-2³¹)~2147483647(2³¹-1)unsignedint一般4个字节0~4294967295(2³²-1)signedlong (int)4个或8个字节-2147483648(-2³¹)~2147483647(2³¹-1)unsignedlong (int)4个或8个字节0~4294967295(2³²-1)signedlong long (int)8个字节-2⁶³~2⁶³-1unsignedlong long (int)8个字节0~18446744073709551615(2⁶⁴-1)9.大端和小端系统小端模式在小端模式下一个字Word的低字节存储在低地址高字节存储在高地址。同同小例如变量0x12345678在内存中的存储顺序为0x78 0x56 0x34 0x12。大端模式在大端模式下一个字的高字节存储在低地址低字节存储在高地址。正反大例如变量0x12345678在内存中的存储顺序为0x12 0x34 0x56 0x78。10.转换规则在涉及多个不同数据类型的算术运算时编译器会按照特定规则将数据转换为相同的类型较低级别的类型——较高级别的类型——以避免数据丢失。char (8位) short int (16位) int (32位) long long (664位)signed unsignedint float double(注意数据丢失)11.printf()的表示1对于整型变量printf支持以下常用的格式化符号%d或%i:用于输出有符号的十进制整数%u:用于输出无符号的十进制整数%o:用于输出八进制的整数%x或%X:用于输出十六进制的整数%x使用小写字母%X使用大写字母2对于小数printf支持以下常用的格式化符号flost和double%f:以小数点格式输出。例如1.000000%e:以科学计数法格式输出。例如1.000000e00%g:根据数值的大小自动选择%f或%e以简洁的方式输出long double:%Lf:以小数点格式输出long double类型的值%Le:以科学计数法格式输出long double类型的值%Lg:根据数值的大小自动选择%Lf或%Le以简洁的方式输出*可以在%f,%e或%g中通过指定的精度来控制小数后保留的位数语法%[宽度].[精度]f:指定输出的最小宽度和小数点后的精度例如以.f为例#includestdio.hintmain(){floata1.234;floatb123;printf(%1.2f\n,a);//输出1.23printf(%1.f\n,b);//输出123printf(%5.f\n,b);//输出 123return0;}3还可以使用修饰符指定不同大小的整型变量%h:用于表示短整型(short)%l:用于表示长整型(long)%ll:用于表示长长整型(long long)4可以通过修饰符来控制输出的宽度、对齐方式、填充字符等宽度指定输出字段的最小宽度。-左对齐:默认情况下输出是右对齐的使用-可以使其左对齐0零填充:用零来填充空白位置而不是默认的空格12.布尔型变量bool1.布尔类型是一种只能表示true(真)或false(假)两种状态的数据类型C99标准引入2. 作用布尔类型主要用于条件判断和逻辑判断3. 使用布尔类型的好处1提高代码的逻辑性和意图表达2防止潜在的编程错误3与现代编程语言接轨4代码优化和类型检查5统一和标准化4.C99标准前C语言没有原生的布尔类型通常使用整数代替布尔值如0表示false非0值表示true。C99标准引用后需要用包含stdbool.h库来使用。5.定义与使用引用头文件#include stdbool.h定义布尔变量bool flag true;布尔值true和false条件判断使用bool变量进行条件判断if (flag) {/* code */}逻辑操作符逻辑与逻辑或||逻辑非!bool ctrue;bool dfalse;if(c){printf(c is true);}else{printf(c is false);}if(!c){printf(c is false);}else{printf(c is true);}if(cd){printf(c and d are true);}else{printf(c and d are not true);}if(c||d){printf(c or d is true);}else{printf(c or d is not true);}6.bool类型与整数的相互转换1布尔类型和整数类型之间存在隐式转换规则任意非零整数在转换为布尔类型时都会被视为true。整数值0转换为布尔类型时会被视为false。2当布尔类型的值用于整数表达时true会自动转换为整数1。false会自动转换为整数0。bool ctrue;bool dfalse;bool e100;bool f-1;printf(%d\n,c);//1printf(%d\n,d);//0printf(%d\n,e);//1printf(%d\n,f);//113.ASCII码ASCII (American Standard Code for Information Interchange)美国信息交换标准代码是基于拉丁字母的一套电脑编码系统主要用于显示现代英语和其他西欧语言。ASCII第一次以规范标准的类型发表是在1967年最后一次更新是在1986年到目前为止共定义了128个字符。常见的ASCII码大小规则数字大写字母小写字母1数字比字母要小。如7“F”2数字0比数字9要小并按0到9顺序递增。如3“8”3字母A比字母Z要小并按A到Z顺序递增。如A“Z”4同个字母的大写字母比小写字母要小32。如A“a”常见的ASCII码大小A为65a为970为48.14.变量的指针1指针是一个存储内存地址的变量指向另一个变量的存储位置。通过指针可以间接访问或操作变量的值。2指针的基本操作取地址操作符获取变量的地址。示例inty20;int*py;//p存储的是y的内存地址解引用操作符*访问指针指向的变量值。示例intz30;int*qz;intvalue*q;//value将被赋值为z的值303野指针指针变量在被创建后如果不能赋值它的缺省值是随机的它的指向是不明确的这样的指针形象的称为野指针。二常量1.字面常量Literal Constants字面常量是指直接出现在代码中的固定值在程序运行期间保持不变。字符常量没有符号名直接以值的形式出现包括整数常量、浮点常量、字符常量、字符串常量。通常存储在程序的常量区或者只读数据区。这意味着它们是不可修改的如果程序试图修改这些字符串可能会导致运行时错误通常是段错误segmentation fault。1整数常量Integer Literals整数常量是没有小数部分的数字可以是十进制decimal八进制octal十六进制hex。十进制整数不带前缀的整数如12-11.八进制整数以0为开头表示如013八进制表示十进制的11十六进制整数以0x或0X开头表示如0xA十进制的100XF十进制的15后缀修饰符u或U表示无符号整数unsigned。l或L表示长整型long。ll或LL表示长长整型long long。2字符串常量String Literals字符串常量是双引号括起来的一系列字符。C语言中的字符串以空字符’\0’结束。*字符串常量中的每个字符都被存储为字符数值的一个元素最后一个字符是\0表示字符串结束。2.符号常量Symbolic Constants符号常量是通过符号名定义的常量。符号常量可以用#define预处理指令或者const关键字定义。1#define定义符号常量定义#define是C语言的预处理指令用来定义符号常量或宏。预处理器会在编译时将符号常量替换为定义的值。语法#define 常量名 常量值示例#define PI 3.14159#define MAX_LENGTH 100特点#define是简单的文本替换不占用内存。无类型检查因此不具备类型安全性。2const定义符号常量定义const 关键字用于定义具有类型的符号常量。使用const修饰的变量不能被修改。语法const 数据类型 常量名 常量值;示例const float PI 3.14159;const int MAX_LENGTH 100;特点const常量有类型限制编译器会进行类型检查。const常量存储在内存中可以参与程序运行时的计算。3.枚举常量枚举类型enum中的枚举成员是整数常量。枚举类型允许定义一组命名的整数常量通常用于表示一组相关的选项或状态。enumColor{RED 1,GREEN, //2BLUE //3};//定义一组枚举常量4.常量的作用1定义不可变的值常量可以用来表示在程序中永远不会改变的数值如数学常量、物理常量等。这些数值一旦定义就不会在程序的执行过程中发生改变。例如PI圆周率就是一个典型的数学常量。例子const double PI 3.14159;//定义圆周率常量2提高代码的可读性使用常量可以使代码更加易读和可理解。例如使用常量代替魔法数字magic number让代码的含义更加明确。不使用常量的代码if(score 60) {printf(“Pass\n”);}使用常量的代码const int PASS_SCORE 60;if(score PASS_SCORE) {printf(“Pass\n”);}3便于维护和修改常量使得程序更加易于维护。如果程序中有多个地方使用同一个固定值使用常量可以很容易地对其进行全局修改而不需要修改多个地方。例子const int MAX_USERS 1000;void createUser() {if(currentUsers MAX_USERS) {printf(“Cannot create more users.\n”);}}如果系统设计变化只需要修改MAX_USERS的定义即可而不需要在每处都手动查找并更改。4防止意外修改常量可以用于保护那些不应该在程序运行过程中被改变的变量。通过const关键字定义的常量可以防止意外的赋值或修改确保程序的行为符合预期。例子const int MAX_CONNECTIONS 100;// MAX_CONNECTIONS是一个常量无法被改变5.常量在嵌入式编程中的作用1外设寄存器地址定义单片机的外设寄存器通常映射到固定的内存地址通过定义常量可以让代码更加清晰、便于维护。2引脚配置常量在单片机中经常需要为每个引脚设置具体的功能输入、输出、上拉、下拉等。为了方便配置和维护可以将这些配置值定义为常量。3状态和错误码定义在单片机编程中经常需要处理设备状态、系统状态和错误码。使用常量定义这些状态码可以使代码更具可维护性。4波特率、定时器频率等硬件配置参数在串口通信、定时器设置等场景中波特率、定时器频率、时钟分频值等都是固定的参数常常作为常量来定义。5延时常量在单片机开发中常常需要通过延时来等待硬件稳定或控制信号周期延时时间通常通过常量来定义以方便管理代码。6通信协议中的固定值使用SPI、I2C、UART等协议进行通信时通常需要定义一些协议相关的变量例如起始位、结束位、校验码、特定命令值等。7中断向量表中的中断号在中断控制器中不同的外设对应不同的中断号通常定义常量可以方便管理中断。三输入输出函数分类输入函数scanf()、getchar()、fgets()输出函数printf()、putchar()、puts()1scanf()功能scanf()用于从标准输入通常是键盘中读取格式化的数据。 原型intscanf(constchar*format,...)参数 format格式控制字符串用来指定输入的数据类型。格式符类似于printf()如%d整型%f浮点型%s字符串等。 其他参数是指向变量的指针用来存储从输入中读取的数据。 示例inta;floatb;scanf(%d %f,a,b);//读取一个整数和一个浮点数返回值返回成功读取的项数即成功匹配的格式说明符的个数如果出现输入错误或达到文件结束则返回负值。 注意事项 scanf可能会跳过空白符空格、换行、制表符等而不处理输入缓冲区中残留的数据。 scanf的输入非常严格如果输入的格式与预期的格式不匹配可能会导致读取失败。2getchar()功能getchar()用于从标准输入读取一个字符。 原型intgetchar(void)参数无参数。 示例charch;chgetchar();//读取单个字符返回值返回读取的字符以int形式返回。如果到达文件结束或发生错误则返回EOF通常定义-1。 注意事项getchar()读取的是缓冲区的第一个字符因此它可能会阻塞等待用户输入直到输入换行符后才能读取下一个字符。 通常需要与循环结合来逐字符读取输入。3fgets()功能用于从输入流读取字符串的函数。相对于gets()fgets()更安全因为它允许指定读取的最大字符数从而避免了缓冲区溢出的问题。因此fgets()是推荐使用的字符串输入函数。 原型char*fgets(char*str,intn,FILE*stream);参数 str指向字符数组的指针用于存储读取到的字符串。 n要读取的最大字符数包括终止符\0。函数最多读取n-1个字符最后一个位置留给字符串终止符\0。 stream输入流。通常为标准输入stdin但可以是任何文件流。 返回值 返回值是指向str的指针表示成功读取的数据。 如果在读取过程中遇到文件结束符EOF或发生错误返回NULL。 注意事项fgets()会在读取到换行符、读取到n-1个字符或者遇到文件结束符EOF时停止读取。 换行符\n会被作为字符串的一部分存储在str中如果读取到的话并在字符串末尾自动添加终止符\0。4printf()功能printf()用于向标准输出通常是屏幕打印格式化的文本。 原型intprintf(constchar*format,...)参数 format格式控制字符串指定如何格式化输出。常见的格式符有%d整型%f浮点数%s字符串等。 其他参数是需要打印的变量。 返回值返回成功打印的字符数。如果输出发生错误返回负值。 注意事项 printf非常灵活可以打印各种类型的数据。 需要确保格式控制符和变量类型匹配否则会引发不正确的输出。5putchar()功能putchar()用于向标准输出打印一个字符。 原型intputchar(intchar)参数char要打印的字符传递的字符以int形式表示但其值应是可表示为unsignedchar的整数。 示例putchar(A);//输出字符‘A’返回值返回输出的字符作为unsignedchar类型转换为int返回。如果发生错误返回EOF。 注意事项putchar()常用于逐个字符的输出例如打印字符数组中的内容。6puts()功能puts()用于向标准输出打印一个字符串并在输出后自动添加换行符。 原型intputs(constchar*str)参数 str要打印的字符串指针。 示例puts(Hello, world!);//输出字符串并换行返回值成功时返回一个非负值失败时返回EOF。 注意事项puts()在打印结束后自动添加换行符不需要手动加\n。 适合用于简单的字符串输出。