页数:53页文件大小:1.00 MB来源: C语言程序设计ppt课件
本课件系统讲解C语言的数据描述方法,先铺垫二进制、八进制、十六进制的转换与原码反码补码等预备知识,再介绍标识符、关键字等基本元素与四大基本数据类型,随后详述整型、浮点、字符与字符串常量的写法、变量的定义与初始化、类型转换规则,最后完整梳理各类运算符与表达式。
第二章 数据描述 Data Representation in C:如同英语由字母、单词、短语、句子、段落到文章构成,C语言由字母数字与特殊符号、常量变量与运算符、表达式、语句、函数到程序逐层构成。
Ch2 数据描述,本章内容:
§2.0 预备知识:计算机中数的表示及进制转换
数制:按基的不同分为十进制、二进制、八进制与十六进制。
各种进制转换成十进制:方法为按权相加。
即把各位数码与其对应权值相乘后求和,得到等值的十进制数。
十进制转换成二、八、十六进制(整数):方法为连续除以基,从低到高记录余数,直至商为0。
二进制与八进制之间的转换:
例:(1101001)₂ = (001,101,001)₂ = (151)₈;(246)₈ = (010,100,110)₂ = (10100110)₂
二进制与十六进制之间的转换:
例:(11010101111101)₂ = (0011,0101,0111,1101)₂ = (357D)₁₆;(4B9E)₁₆ = (0100,1011,1001,1110)₂
数码对照:0000~0、0001~1、0010~2 …… 1010~A、1011~B、1100~C、1101~D、1110~E、1111~F
字节和位
数值的表示方法——原码、反码和补码
补码使减法可转化为加法运算。
原码、反码与补码对照(用一字节表示数):
| 数值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +7 | 00000111 | 00000111 | 00000111 |
| -7 | 10000111 | 11111000 | 11111001 |
| +0 | 00000000 | 00000000 | 00000000 |
| -0 | 10000000 | 11111111 | 00000000 |
| 数的范围 | -127~+127 | -127~+127 | -128~+127 |
负数补码转换成十进制:最高位不动,其余位取反加1。例:补码 11111001 → 取反 10000110 → 加1 得 -7。
§2.1 C的基本元素 —— 标识符 Identifiers
C的基本符号:字母26个(大小写敏感)、数字10个(0~9)、特殊符号(; ( ) < > "" '' # { } _ \\ % : + - * / 等)。
标识符合法性判断示例:sum、Sum、day、Date、student_name、lotus_1_2_3 合法;M.D.John、3days、#33、$123、a>b、int 不合法。
§2.1 C的基本元素
分隔符 Delimiters(§2.1 C的基本元素):用于分隔C程序中的各类语法成分,如空格、逗号、分号、括号等,使编译器能够正确识别标识符与语句边界。
§2.2 C data types:数据类型决定——1. 数据占内存字节数;2. 数据取值范围;3. 其上可进行的操作。
4 basic data types in C:字符型 char、整型 int、单精度浮点型 float、双精度浮点型 double。
4 additional qualifiers 类型修饰符:short、long、signed、unsigned。
修饰符与 int、char 组合可派生出更丰富的类型。
基本数据类型总表:
| 类型 | 关键字 | 位数 | 取值范围 |
|---|---|---|---|
| 整型 | (signed)int | 16/32 | -32768~32767 |
| 短整型 | (signed)short | 16 | -32768~32767 |
| 长整型 | (signed)long | 32 | -2147483648~2147483647 |
| 无符号整型 | unsigned int | 16/32 | 0~65535 / 0~2³²-1 |
| 无符号短整型 | unsigned short | 16 | 0~65535 |
| 无符号长整型 | unsigned long | 32 | 0~2³²-1 |
| 字符型 | char | 8 | -128~127 |
| 无符号字符型 | unsigned char | 8 | 0~255 |
| 单精度实型 | float | 32 | -3.4e-38~3.4e38,有效数字7位 |
| 双精度实型 | double | 64 | -1.7e-308~1.7e308,有效数字15位 |
整型按二进制补码存储,字符型按 ASCII 码存储;实型由符号位、尾数与阶数构成,具体界限参见 limits.h 与 float.h。
§2.3 常量与变量
使用符号常量的好处:1. 提高可读性;2. 易于修改。
示例:#define PRICE 30、#define PI 3.14
整型常量的三种形式:
类型规则:无后缀时按其值所在范围确定类型;后缀 u/U 为 unsigned int,后缀 l/L 为 long int。
练习:0377 = 255,0x123 = 291,0Xff = 255(均为十进制)。
浮点型常量的两种形式:
类型规则:默认为 double;后缀 f/F 为 float;后缀 l/L 为 long double。
字符常量:用单引号括起来的单个普通字符或转义字符,其值为该字符的 ASCII 码值。
例:'A' 为 65,'a' 为 97,'0' 为 48,'\n' 为 10;'\\101'、'\\x41' 均表示 'A';'\012' 表示 '\n'。
转义字符:反斜线后跟一个字符或代码值,如 \n 换行、\r 回车不换行、\t 水平制表、\\\ 反斜线、\\' 单引号、\\" 双引号、\v 垂直制表、\b 退格、\f 换页、\\a 响铃、\\ooo 三位八进制、\\xhh 二位十六进制、\0 空字符。
本页源文件未提取到文字内容,仅有图片(源文件此处为空段)。建议对照原课件图片补充本页要点说明。
字符串常量:用双引号括起来的零个或多个字符序列(含转义字符),数据类型为字符数组。存储时每个字符串尾自动加一个 '\0' 作为结束标志。
例:'a' 占1字节;"a" 占2字节(a 与 \0);空串 "" 占1字节;"Hello" 按 h e l l o \0 依次存放。
转义字符用于字符串中特殊字符的表示:"I say:\\"How are you?\\"\n"、"\\\C Program\\\n"。
字符常量与字符串常量不同:char ch; ch='A'; 正确;ch="A"; 错误。
变量 Variables:程序运行中其值可以改变的量,是对程序中数据存储空间的抽象,程序中使用变量名对内存操作。
例:int a; 分配2字节单元,a=100; 把100存入该单元。
变量:每个变量有名字和类型,变量值是变量名对应的内存单元中存放的数据。
例:int a; a=1; 中 a 占2字节内存单元,存放数据1。
变量定义 Declaration:目的是通知编译程序为变量分配内存单元,原则是先定义后使用。格式:var_type var_name1, var_name2, …;
初始化 Initialization:定义时赋初值,变量使用前必须先赋值。例:int a=2,b,c=4; float data=3.67; char ch='A';
注意:int x=y=z=1; 写法错误;浮点型不能做 % 运算;变量名拼写错误会导致 Undefined symbol 报错。
变量定义位置:一般放在函数内第一条可执行语句前面或函数外。
变量类型
C中没有字符串型变量,字符串用字符数组存放。
例:a='0'; 即 a=48;x='A'+5 即 70;s='!'+'G' 即 104。
手工模拟:
#include <stdio.h> #define PRICE 12.5 void main() { int num = 3; float total; char ch1, ch2 = 'D'; total = num * PRICE; ch1 = ch2 - 'A' + 'a'; printf("total=%f,ch1=%c\n", total, ch1); }Output:total=37.500000, ch1=d
内存中 num 存3,ch2 存 'D',total 存37.5,ch1 存 'd'。
Is char completely the same as int?
void main() { char c1, c2; c1 = 'A' + 32; c2 = 353; printf("%c%c\n", c1, c2); }Output:a a
原因:(353)₁₀ = (161)₈ = 1×8²+6×8+1 = 97,即字符 'a' 的 ASCII 码,char 只取一字节低8位。
§2.4 数据类型转换:程序运行中数据由一种类型改变成另一种类型。
隐式转换(自动转换)发生场景:
运算转换规则:不同类型数据运算时先自动转换成同一类型。
算术转换规则:char、short 必定先转换成 int;类型不同时按 char,short → int → unsigned → long → double 的方向由窄向宽转换(narrower → wider)。
例:设有 char ch; int i; float f; double d; 则 ch/i + f*d - (f+i) 的结果为 double 型。
例:10 + 'a' + i*f - d/l(int i; float f; double d; long l;)结果为 double 型。
显式转换(强制转换):(type-name)expression
#include <stdio.h> void main() { float x; int i; x = 3.6; i = (int)x; printf("x=%f,i=%d\n", x, i); }Output:x=3.600000, i=3
强制转换得到所需类型的中间变量,原变量类型不变;较高类型向较低类型转换时可能发生精度损失。
例:(int)(x+y)、(int)x+y、(double)(3/2)=1.0、(int)3.6=3
§2.5 运算符与表达式:运算符 operator 与运算量 operand 构成表达式。
Operators: 34:算术 + - * / % ++ --;关系 < <= == > >= !=;逻辑 ! && ||;位 << >> ~ | ^ &;赋值 = *= /= %= += -= <<= >>= &= ^= |=;条件 ?:;逗号 ,;指针 * &;求字节 sizeof;强制类型转换 (type);分量 . ->;下标 [ ];其他 ( )
运算符的学习要点:
表达式 Expressions:运算符与运算量的组合式,变量和常量都是表达式,表达式都有值和类型。
基本算术运算符:+ - * / %,双目运算符,结合方向从左向右。
优先级:-(单目)(2) → * / % (3) → + -(双目)(4),括号 ( ) 内优先级最高 (1)。
自增、自减运算符 ++ --:使变量值加1或减1,单目运算符。
例:j=3; k=++j; → k=4, j=4;j=3; k=j++; → k=3, j=4
例:a=3;b=5; c=(++a)*b → c=20, a=4;c=(a++)*b → c=15, a=4
自增、自减运算符使用说明:
例:-i++ 等价于 -(i++);i=3 时 printf("%d", -i++) 输出 -3。
基本赋值运算符:var = exp,双目运算符,结合方向自右向左,优先级14。
复合赋值运算符:+= -= *= /= %= <<= >>= &= ^= |=,var op= exp 等价于 var = var op exp。
例:a+=3 等价于 a=a+3;x*=y+8 等价于 x=x*(y+8);x%=3 等价于 x=x%3。
赋值运算符说明:
例:int i; i=2.56; → i=2
例:a=b=c=5 → 5→c, c→b, b→a,表达式值5;a=5+(c=6) → 表达式值11;a=(b=4)+(c=6) → 表达式值10;a=(b=10)/(c=2) → 表达式值5
复合赋值嵌套示例:
嵌套赋值应从右向左逐步展开,避免书写歧义。
逗号运算符:exp1, exp2 [, … , expn]
例:a=3*5, a*4 → a=15,表达式值60;x=(a=3, 6*3) → 赋值表达式值18,x=18;x=a=3, 6*a → 逗号表达式值18,x=3
例:printf("%d,%d,%d", (a,b,c), b, c); 输出 3,2,3
#include <stdio.h> void main() { int x, y = 7; float z = 4; x = (y = y + 6, y / z); printf("x=%d\n", x); }Output:x=3
先计算 y=y+6 得 y=13,再计算 y/z = 13/4 = 3.25,赋给整型 x 后取整为3。
关系运算符:< <= == >= > !=,用于比较两个数值,双目运算符,结合方向自左向右。
优先级别:< <= > >= 为 (6),== != 为 (7)。
关系表达式的值是逻辑值「真」或「假」,用1和0表示。
例:c>a+b 即 c>(a+b);a>b!=c 即 (a>b)!=c;a==b<c 即 a==(b<c);a=b>c 即 a=(b>c)
关系运算示例:设 int a=3, b=2, c=1, d, f;
关系运算注意:
逻辑运算符:&& || !,用于构造复杂表达式。
例:a<=x && x<=b 即 (a<=x) && (x<=b);a>b&&x>y;a==b||x==y;!a||a>b 即 (!a)||(a>b)
| 运算符 | 功能 | 运算数 | 结合性 | 优先级 |
|---|---|---|---|---|
| ! | 逻辑非 | 单目 | 右 | 2 |
| && | 逻辑与 | 双目 | 左 | 11 |
| || | 逻辑或 | 双目 | 左 | 12 |
逻辑运算真值表:C语言中运算量 0 为「假」、非0为「真」;运算结果 0 为「假」、1为「真」。
| a | b | !a | !b | a&&b | a||b |
|---|---|---|---|---|---|
| 真 | 真 | 假 | 假 | 真 | 真 |
| 真 | 假 | 假 | 真 | 假 | 真 |
| 假 | 真 | 真 | 假 | 假 | 真 |
| 假 | 假 | 真 | 真 | 假 | 假 |
逻辑运算示例:设 a=4, b=5;
短路特性:逻辑表达式求解时并非所有逻辑运算符都被执行,只在必须执行下一个运算符才能求出表达式解时才执行。
例:a=1;b=2;c=3;d=4;m=1;n=1; (m=a>b)&&(n=c>d); 结果 m=0, n=1(n=c>d 未被执行)。
条件运算符:expr1 ? expr2 : expr3,三目运算符,优先级13,结合方向自右向左。
执行过程:先判断 expr1,非0取 expr2 的值,为0取 expr3 的值。
例:a>b?a:c>d?c:d 等价于 a>b?a:(c>d?c:d)
本章小结:C语言组成的基本元素(标识符、关键字、空白字符、注释、分隔符、常量、运算符);基本数据类型(int、short、long、unsigned 系列、float、double、char、unsigned char);常量与变量(符号常量与直接常量,含整型、实型、字符型、字符串常量);数据类型转换(强制转换与自动转换,含运算转换、赋值转换、输出转换、函数调用转换);运算符和表达式的使用(算术、赋值、逗号、关系、逻辑、条件运算符)。
整型数据的表示范围(二进制补码):
数制的基、权、数码与特点:
| 数制 | 数码 | 基 | 权 | 特点 |
|---|---|---|---|---|
| 十进制数 | 0~9 | 10 | 10⁰,10¹,10²,… | 逢十进一 |
| 二进制数 | 0~1 | 2 | 2⁰,2¹,2²,… | 逢二进一 |
| 八进制数 | 0~7 | 8 | 8⁰,8¹,8²,… | 逢八进一 |
| 十六进制数 | 0~9, A~F, a~f | 16 | 16⁰,16¹,16²,… | 逢十六进一 |
按权相加示例:十进制 4956 = 4×10³+9×10²+5×10¹+6×10⁰;二进制 1011 = 1×2³+0×2²+1×2¹+1×2⁰;八进制 4275 = 4×8³+2×8²+7×8¹+5×8⁰;十六进制 81AE = 8×16³+1×16²+10×16¹+14×16⁰。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}