一、变量的定义与分类包括变量的命名规则、作用域、生命周期、使用注意1、变量的概念变量是用来存储数据的被命名的内存位置。变量需要用一个有名字的、具有特定属性的存储单元来存放数据。变量必须先定义后使用或先声明后使用定义时指定名字和类型也可以指定初值2、变量的定义与初始化存储类型 数据类型 变量名 初始值2.1、存储类型说明符——用于控制变量的存储位置、生命周期和作用域auto局部变量默认关键字只能用于函数内或块内static声明为静态变量生命周期为整个程序但作用域受限extern声明为外部变量全局变量的默认存储类型register建议编译器将变量存储在寄存器中以提高访问速度typedef用于定义类型别名2.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 语言的作用域包括局部作用域 (Local Scope)仅在函数、代码块或文件内可见。全局作用域 (Global Scope)在整个程序中可见5、变量的生命周期变量的生命周期是指变量从创建到销毁的整个过程变量类型存储位置生命周期作用域自动变量(auto)栈stack随着函数或代码块的进入创建离开销毁定义它的函数或代码块内部静态局部变量(static)静态数据区从程序开始到程序结束只初始化一次定义它的函数内部(或代码块内部)静态全局变量(static)静态数据区从程序开始到程序结束定义它的文件内部外部变量(extern)静态数据区从程序开始到程序结束可以在其他文件中通过extern声明访问5、局部变量与全局变量局部变量作用域仅限函数或代码块内部生命周期随函数调用而开始随函数的结束而销毁通常存储在栈中未初始化时值是未定义的随机垃圾值。全局变量作用域可以扩展到整个程序生命周期从程序开始到结束存储在静态存储区未初始化时默认值为0。5.1、使用变量时注意1、变量必须先声明后使用。2、变量一旦声明就不能再更改其类型。3、同一个作用域内不能命名重名的变量。4、变量遮蔽当在一个嵌套的作用域中定义了与外部作用域中同名的变量时内部变量会遮蔽外部变量。需要注意变量的实际作用域以避免意外的结果① 特殊情况同名变量如果局部变量和全局变量名字一样在局部作用域内局部变量优先就 近原则#include stdio.h int a 100; // 全局变量 int main() { int a 10; // 局部变量 printf(a%d\n, a); // 10 输出 return 0; }5、注意变量的占用空间和取值范围6、注意变量的初始化二、整型变量int——包括原码、反码、补码、大小端系统1、原码原码符号位加上真值的绝对值即用第1位表示符号其余位表示值[1111 1111 , 0111 1111][-127 , 127]0111 1111最高位第 1 位是符号位0表示正数剩下 7 位是数值111 1111十进制是127所以它表示1271111 1111最高位是符号位1表示负数剩下 7 位是数值111 1111十进制是127所以它表示-1272、反码正数的反码是其本身负数的反码是在其原码的基础上符号位不变其余各个位取反。[1] [0000 0001]原 [0000 0001]反[-1] [1000 0001]原 [1111 1110]反计算时溢出的进位需要加到最低位3、补码正数的补码就是其本身负数的补码是在其原码的基础上符号位不变其余各位取反最后1。(也即在反码的基础上1)[1] [0000 0001]原 [0000 0001]反 [0000 0001]补[-1] [1000 0001]原 [1111 1110]反 [1111 1111]补4、大端和小端系统大端模式高字节存储在低地址低字节存储在高地址。小端模式低字节存储在低地址高字节存储在高地址。5、unsigned和signed的异同相同点都是在一段存储空间存储的数字计算方法一样不同点混合判断时格式转换不同溢出后的取值不算严格上的不同点只是表示方法不同计算方式是一样的//混合判断时 #include stdio.h int main(void) { unsigned int a 5;//无符号数 signed int b -5;//有符号数 if(b a) { printf(b is less than a\n); } else { printf(a is less than b\n); } return 0; }//结果是 a is less than b//保持类型一致 #include stdio.h int main(void) { signed int a 5;//无符号数 signed int b -5;//有符号数 if(b a) { printf(b is less than a\n); } else { printf(a is less than b\n); } return 0; }//结果是 b is less than a;6、转换规则在涉及多个不同数据类型的算术运算时编译器会按照特定规则将数据转换为相同的类型。“较低”级别的类型 →“较高”级别的类型——以避免数据丢失。char8位 short int16位 int32位 long long64位signed unsignedint float double (注意数据丢失7、printf()的表示对于整型变量printf 支持以下常用的格式化符号%d 或 %i用于输出有符号的十进制整数%u用于输出无符号的十进制整数%o用于输出八进制整数%x 或 %X用于输出十六进制整数%x 使用小写字母%X 使用大写字母在 printf 中还可以使用修饰符指定不同大小的整型变量%h用于表示短整型short%l用于表示长整型long%ll用于表示长长整型long long可以通过修饰符来控制输出的宽度、对齐方式、填充字符等宽度指定输出字段的最小宽度。-左对齐默认情况下输出是右对齐的使用 - 可以使其左对齐。0零填充用零来填充空白位置而不是默认的空格三、浮点型变量float1、浮点型案例浮点数既包含小数又包含整数的数据类型也称为实数型浮点型常量默认为double型可用F或f后缀标记为float型用L或l标记为long double型。#include stdio.h int main(void) { float a; a 7 / 2.0; a 7.0 / 2; printf(%f %f\n,a,a); return 0; }//结果是3.500000;#include stdio.h int main(void) { long double a 3.1415926; __mingw_printf(%Lf\n,a);//简单说__mingw_printf MinGW 版的 printf return 0; }//结果是3.141593; //普通 double用%lf打印 //long double 必须用 %Lf大写 L用错会打印出错误的数值;2、赋值和运算细节赋值时如果给浮点型赋值整数系统会自动为整数补上小数点。如果给整数型变量赋值了小数系统会直接将小数舍去变为整数注意这里是舍去而不是四舍五入。在有乘除的运算中只要有一个数是浮点数系统会自动把其他整数转换成浮点数。给浮点数赋值的时候如果赋值号右边是计算式要把右边的运算数变成小数才行。3、printf()中对小数的输出float 和 double%f以小数点格式输出。例如3.141592%e以科学计数法格式输出。例如3.141592e00%g根据数值的大小自动选择 %f 或 %e以简洁的方式输出。long double%Lf以小数点格式输出 long double 类型的值。%Le以科学计数法格式输出 long double 类型的值。%Lg根据数值的大小自动选择 %Lf 或 %Le以简洁的方式输出。可以在 %f、%e 或 %g 中通过指定精度来控制小数点后保留的位数。语法为%[宽度].[精度]f指定输出的最小宽度和小数点后的精度。使用 - 符号可以左对齐输出。如果在 C 语言中写一个小数默认情况下它会被解释为 double 类型。如果你想明确地告诉编译器这个小数是 float 类型或 long double 类型就需要在小数的末尾加上 f 或 L四、字符型变量char1、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”为65“a”为97“0”为 482、转义字符转义字符含义ASCII值 (十进制)ASCII值 (十六进制)\n换行符 (newline)100x0A\r回车符 (carriage return)130x0D\t制表符 (tab)90x09\b退格符 (backspace)80x08\f换页符 (form feed)120x0C\a响铃符 (alert/bell)70x07\v垂直制表符 (vertical tab)110x0B\\反斜杠 (backslash)920x5C\单引号 (single quote)390x27\双引号 (double quote)340x22\?问号 (question mark)630x3F\0空字符 (null character)00x00五、布尔型变量bool1、布尔类型的引入1.1、概念布尔类型是一种只能表示true真或false假两种状态的数据类型。C99标准引入。作用布尔类型主要用于条件判断和逻辑操作。1. 提高代码的逻辑性和意图表达2. 防止潜在的编程错误3. 与现代编程语言接轨4. 代码优化和类型检查5. 统一和标准化1.2、语法格式C99标准之前C语言没有原生的布尔类型通常使用整数代替布尔值如0表示false非零值表示trueC99标准中引入了布尔类型需要通过包含stdbool.h库来使用。定义与使用引入头文件#include stdbool.h定义布尔变量bool flag true;布尔值true和false1.3、布尔变量的操作条件判断使用bool变量进行条件判断if (flag) { /* code */ }逻辑操作符逻辑与逻辑或||逻辑非!1.4、bool类型与整数的相互转换布尔类型 (bool) 和整数类型之间存在隐式转换规则任意非零整数在转换为布尔类型时都会被视为 true。整数值 0 转换为布尔类型时会被视为 false。当布尔类型的值用于整数表达式时true 会自动转换为整数值 1false 会自动转换为整数值 01.5、自定义bool类型在 C89 标准及其之前版本如 C90C 语言并没有原生支持 bool 类型。在这些版本的 C 语言中布尔值通常使用整数来表示0 表示 false。非零值通常为 1表示 true。#include stdio.h #define bool int #define true 1 #define false 0 int main(void) { bool flag true; if(flag) { printf(True\n); } else { printf(False\n); } return 0; }//结果ture六、静态变量static定义使用 static 关键字声明的变量既可以是局部变量也可以是全局变量静态局部变量仅在当前函数内可见但其生命周期贯穿整个程序的运行静态全局变量则只能在声明它的文件中访问。生命周期从程序开始运行时创建直到程序结束时销毁即使函数已经退出静态变量的值也不会丢失。使用场景:• 维护状态信息在函数内部使用静态变量可以保留函数的状态信息从而在多次调用之间维持该状态。• 限制作用域通过将变量声明为 static可以限制其作用域到当前文件或函数避免名称冲突增强封装性。•性能优化静态变量的值在多次调用之间保持不变有助于避免不必要的初始化七、变量的指针1、什么是指针指针是一个存储内存地址的变量指向另一个变量的存储位置通过指针可以间接访问或操作变量的值。2、指针操作指针的基本操作取地址操作符 获取变量的地址。示例int y 20;int *p y; // p 存储的是 y 的内存地址解引用操作符 *访问指针指向的变量值。示例int z 30;int *q z;int value *q; // value 将被赋值为 z 的值 30野指针指针变量在被创建后如果不被赋值他的缺省值是随机的它的指向是不明确的这样的指针形象地称为“野指针”。赋空值p0p\0’pNULL#include stdio.h int main(void) { int x 10; int y 20; int *p x; int *q y; printf(%d %d\n,p,*p); printf(%d %d\n,q,*q); return 0; }3、指针的加法当你对指针执行加法操作时实际上是将指针向前移动多个元素的大小。例如如果 p 是指向 int 的指针p 1 会将指针 p 移动到下一个 int 类型的内存地址通常是增加 sizeof(int) 字节4、指针的减法类似于加法减法操作将指针向后移动。例如p - 1 会将指针 p 移动到前一个 int 类型的内存地址5、指针自增和自减指针也可以使用自增和自减--操作符。p 会将指针移动到下一个元素p-- 会将指针移动到前一个元素。※p p 1 ; p-- p - 1 ;八、进制转换与存储单位1、十进制与二进制2、十进制与八进制3、十进制与十六进制4、二进制与八进制5、二进制与十六进制6、计算机的存储单位位bit)二进制数中的一个数位可以是0或者1是计算机中数据的最小单位。字节(Byte,B)计算机中数据的基本单位每8位组成一个字节。各种信息在计算机中存储、处理至少需要一个字节。KB早期用的软盘有360KB和720KB的不过软盘已经很少使用。MB早期微型机的内存有128MB、256MB、512MB目前内存都是1GB、2GB甚至更大。GB早期微型机的硬盘有60GB、80GB目前都是500GB、1TB甚至更大。TB目前个人用的微型机存储容量也都能达到这个级别了而作为服务器或者专门的计算机不可缺少这么大的存储容量。1Byt 8bits1KB1024B2的10次方B