#课堂笔记第二章部分2.1C语言的数据类型2.2标识符常量和变量2.2.2常量2.2.3变量变量名用来标识这块内存实际上代表了一个存储地址。变量如何定义要掌握2.3.整型数据类型2.3.1 整型数据的分类不用记基本整型 (int)通常占 4 个字节32 位短整型 (short int)占 2 个字节16 位长整型 (long int)在 VC6 环境下也是 4 个字节不同编译器可能不同其中1 字节 8 位二进制。所以一共能表示的组合数是2的8次方256就是0-255最大是2552.3.2 整型常量的表示方法十进制直接写数字如123,-456,0八进制以0开头Octa-八如0123注意0100表示八进制的 64十六进制以0x或0X开头如0x12,-0xFF后缀l表示长整型u表示无符号整型比如#include stdio.hvoid main(){int a,b;a0100; // 八进制数实际是十进制的 64ba20; // 64 20 84printf(%d\n,a); // 输出 64printf(%d\n,b); // 输出 84} 这里的重点是前导 0 表示八进制所以0100是1*8*2642.3.3所有整型变量有符号整数在内存中都是以二进制补码形式存储的。补码的好处是正负数都能用同一套规则进行加减运算硬件实现更简单。 补码表示示例10的补码00000000 00000000 00000000 00001010-10的补码11111111 11111111 11111111 11110110这是通过“取反再加一”得到的 整型变量的分类基本类型int有符号signed int无符号unsigned int短整型short int有符号signed short int无符号unsigned short int长整型long int有符号signed long int无符号unsigned long int 注意如果不写signed或unsigned默认是有符号。 其他注意点只有整型数据能加signed或unsigned修饰浮点型不能。输出无符号整型时要用%u格式说明符。unsigned short p 50; printf(%u\n, p); // 输出 502.4实型数据浮点型重点就是你提到的两个方面存储空间和有效数字。 存储空间不同类型的浮点数占用的字节数不同决定了它们能表示的范围和精度float单精度4 字节约 6–7 位有效数字double双精度8 字节约 15–16 位有效数字long double长双精度在不同编译器里大小不同Turbo C 是 16 字节VC6 是 8 字节 存储空间越大能表示的数值范围越广精度也越高。 有效数字 浮点常量的表示浮点数是用科学计数法的二进制形式IEEE 754 标准存储的。有效数字位数有限超过的部分会被舍去导致舍入误差。例如float只能保证 7 位有效数字所以1234.1415926会被存成1234.141602。浮点数的存储方式C 语言中实数以规范化指数形式存储小数点前为 0小数点后第一位必须非零。例如 3.141590.314159×101小数部分位数越多 → 精度越高十进制小数形式必须带小数点如.123,123.0,0.0指数形式如1.234e3表示 1.234×103E前必须有数E后必须是整数可正可负不合法示例e3,1e2.3,.e3指数部分位数越多 → 表示范围越大2.5.字符型数据2.5.1字符常量 字符型数据的存储字符占 1 字节存储的是它的ASCII 码值整数形式。ASCII 字符集包括字母A–Z, a–z数字0–9特殊符号如! # ( ) *等空格类空格、制表符、换行符等不可显示字符如\0(空字符)、\a(警告)、\b(退格)、\r(回车) 转义字符转义字符以反斜杠\开头用于表示特殊符号或控制符\t→ 跳到下一个制表位\b→ 删除前一个字符\r→ 回到本行开头\f→ 跳到下一页开头\0→ 字符串结束标志\\→ 输出一个反斜杠\→ 输出单引号\→ 输出双引号\ddd→ 八进制表示的字符\xhh→ 十六进制表示的字符 字符常量与字符串常量字符常量用单引号 括起来的一个字符。是常量哦如a,1,X注意a ≠ A它们的 ASCII 值不同。转义字符也能作为字符常量比如\n。字符串常量用双引号 括起来的一串字符。如This is a string,5433, 空格字符串,空串例子china\b\n101\t\\实际由10 个字符组成包括转义符。2.5.2字符变量 定义字符型变量用char定义占用1 个字节8 位。每个字符实际上存储的是它的ASCII 码值。定义方式的例子注意单引号char c A; // 存储字符 A char c 65; // 存储整数 65对应字符 A 字符与整数的关系字符和整数在一定条件下可以互通a实际上就是整数 97ASCII 码。b就是整数 98。所以下图正常来说应该是char c1‘ac2’b‘但是用数字也可以char c1 97, c2 98; printf(%c %c\n, c1, c2); // 输出 a b printf(%d %d\n, c1, c2); // 输出 97 98 格式化输出%c→ 按字符形式输出。character%d→ 按整数形式输出显示 ASCII 码值。decimal十进制 举例63空格char c ?; printf(%d %c\n, c, c); // 输出 63 ? 字符与整数的区别其他2.6.运算符及表达式①概况 运算符的分类算术运算符 - * / %在 C 语言中/的运算结果由操作数的类型决定不是固定的整除 / 实数除核心规则就两条1. 两个操作数都是整数int/long 等→整除2. 操作数中至少有一个是浮点数float/double→实数除基本的加减乘除和取余。注意字符 1存储的是符号1的 ASCII 码十进制 49二进制 00110001。整数 1存储的是数值 1 的补码二进制 00000001占 4 字节。所以1和1是完全不同的概念。 字符运算与规律字符可以参与算术运算因为本质上它就是整数。规律小写字母减去 32 就是对应的大写字母。a(97) →A(65)b(98) →B(66)关系运算符 ! 用来比较大小或是否相等结果是布尔值真/假。逻辑运算符! ||逻辑非、逻辑与、逻辑或。位运算符 ~ | ^ 对二进制位进行操作比如左移、右移、按位与、按位或、按位异或、按位取反。赋值运算符以及扩展赋值如,-,*,/,%。条件运算符三目运算符?:格式条件 ? 表达式1 : 表达式2。逗号运算符,多个表达式顺序执行整个表达式的值是最后一个。指针运算符* *表示取值解引用表示取地址。求字节数运算符sizeof返回某个类型或变量占用的字节数。强制类型转换运算符(类型)② 表达式的类型③算术运算符④⚠️重点自增、自减运算符 自增、自减运算符把一个值转换为指定类型。成员运算符-用于结构体指针访问成员。下标运算符[ ]用于数组元素访问。其他函数调用运算符()。算术表达式如23*5关系表达式如x y逻辑表达式如x0 y0赋值表达式如a 5逗号表达式如a3, b4, c8值是最后一个表达式的结果基本运算符加法单目时表示正号-减法单目时表示负号*乘法/除法%取余只能用于整数整数除法的特点两个整数相除结果仍是整数小数部分会被舍弃。例如5 / 3 1如果有负数舍入方向可能不同在某些系统中-5 / 3 -1在另一些系统中-5 / 3 -2。VC 采用“向零取整”的规则5 / 3 1-5 / 3 -1作用让变量的值加 1 或减 1。写法i/i--i在前所以先使用变量i再让它加减1。i/--i先让变量i加减1再使用它。一些说明在 C 的优先级表格中自增和自减--的优先级确实比加、减、乘、除都要高例题如a3则表达式-a的值为多少?执行后 a的值为多少?1单目运算符只作用于一个操作数。例如a,--a,-a,!a双目运算符作用于两个操作数。例如ab,a-b,a*b,a/b三目运算符作用于三个操作数。例如条件运算符a ? b : c2只能用于整型变量包括char不能用于浮点型或常量或表达式。错误示例如图右结合性表达式从右往左结合。例如-a等价于-(a)。例题1初始值a 2,b 9①a b / a②a (b / a) 区别这两个1. 表达式一a b / a在这个式子中自增都在变量后面后置自增。初值a 2,b 9。优先级b和a优先级最高但因为是后置它们会“先参与当前运算这行运行完再加 1”。计算步骤取b的当前值9。取a的当前值2。进行除法9 / 2 4在 C 语言中整数除以整数结果还是整数小数部分被舍弃。进行加法a 4 2 4 6$。结果6。执行后这行算完后a变成 3b变成 10。2. 表达式二a (b / a)在这个式子中自增都在变量前面前置自增且有括号。初值a 2,b 9。优先级括号里的b和a优先级最高且因为是前置它们必须“先加 1再拿新值参与运算”。计算步骤执行bb从 9 变成10。执行aa从 2 变成3。执行括号内的除法$10 / 3 3$同样舍弃小数。执行最后的加法因为一开始的a也是运算的一部分呀b和a先执行之后再参与整行的运算所以此时最前面的a已经变成3了所以是 3 3 6$。结果6。例2假设a是 3-a-a情况 A后置自增-a如a3则表达式-a的值为多少?执行后 a的值为多少? -3,4因为优先级更高它会先和a结合。逻辑相当于-(a)。执行取出a的值先做负号运算得到-3然后a再自增变成 4。情况 B前置自增-a逻辑也是从右往左结合相当于-(a)。执行a先自增变成 4然后再取负号结果是-4。⑤强制float转int⑥逗号运算符知识点逗号表达式的一般形式为表达式1, 表达式2, ... 表达式n。执行顺序从左到右依次计算各个表达式的值。最终取值整个逗号表达式的值取最后一个表达式即表达式 n的值。例题1x(a4%3, a1, a*10)括号内部运算执行a4%34除以3取余数a变成1。执行a1计算 112。注意这里只是计算并没有赋值给 a所以a依然是 1。执行a*10计算 1*10 10。最终赋值括号里最后一部分的值是10。由于整个括号被赋给了x即x(...)所以x 10。例题2首先括号有优先级所以先算a4*5a*2依次执行得到a2040但是a并没有变成40哦没有赋值给a由于逗号表达式的值取最后一个值所以这个取40其次是40a6这一块儿因为a还是20所以逗号表达式最终结果是26⑦关于赋值语句