首页计算机计算机软件C语言程序设计 02 第二章 数据描述.pptx

02 第二章 数据描述.pptx

页数:53页文件大小:1.00 MB来源: C语言程序设计ppt课件

本课件系统讲解C语言的数据描述方法,先铺垫二进制、八进制、十六进制的转换与原码反码补码等预备知识,再介绍标识符、关键字等基本元素与四大基本数据类型,随后详述整型、浮点、字符与字符串常量的写法、变量的定义与初始化、类型转换规则,最后完整梳理各类运算符与表达式。

第二章导言页,用英语与C语言的字母、单词、句子层次类比说明程序构成要素
第二章数据描述章节目录页,列出预备知识、基本元素、数据类型与运算符等学习主线
§2.0预备知识页,讲解数码、基、权三个概念与计算机中数的进制表示
查看本课件的文字版(共 53 页,供检索与复制)

第1页:第二章数据描述导言

第二章 数据描述 Data Representation in C:如同英语由字母、单词、短语、句子、段落到文章构成,C语言由字母数字与特殊符号、常量变量与运算符、表达式、语句、函数到程序逐层构成。

第2页:第二章内容导览

Ch2 数据描述,本章内容:

  • 预备知识
  • C基本元素
  • C数据类型
  • 常量与变量
  • 数据类型转换
  • 运算符与表达式

第3页:数制与数码基权

§2.0 预备知识:计算机中数的表示及进制转换

数码
表示数的符号
基
数码的个数
权
每一位所具有的值

数制:按基的不同分为十进制、二进制、八进制与十六进制。

第4页:按权相加转十进制

各种进制转换成十进制:方法为按权相加。

即把各位数码与其对应权值相乘后求和,得到等值的十进制数。

第5页:除基取余法转换示例

十进制转换成二、八、十六进制(整数):方法为连续除以基,从低到高记录余数,直至商为0。

  • (59)₁₀ = (111011)₂
  • (159)₁₀ = (237)₈
  • (459)₁₀ = (1CB)₁₆

第6页:二进制与八进制互转

二进制与八进制之间的转换:

  • 二进制转八进制:从右向左每3位一组(不足3位左补0),转换成八进制
  • 八进制转二进制:用3位二进制数代替每一位八进制数

例:(1101001)₂ = (001,101,001)₂ = (151)₈;(246)₈ = (010,100,110)₂ = (10100110)₂

第7页:二进制与十六进制互转

二进制与十六进制之间的转换:

  • 二进制转十六进制:从右向左每4位一组(不足4位左补0),转换成十六进制
  • 十六进制转二进制:用4位二进制数代替每一位十六进制数

例:(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

第8页:字节与位

字节和位

  • 内存以字节为单元组成
  • 每个字节有一个地址
  • 一个字节一般由8个二进制位组成
  • 每个二进位的值是0或1

第9页:原码反码与补码

数值的表示方法——原码、反码和补码

原码
最高位为符号位,其余各位为数值本身的绝对值
反码
正数与原码相同;负数符号位为1,其余位对原码取反
补码
正数三种表示相同;负数最高位为1,其余位为原码取反后整个数加1

补码使减法可转化为加法运算。

第10页:原码反码补码对照表

原码、反码与补码对照(用一字节表示数):

原码反码补码对照表
数值原码反码补码
+7000001110000011100000111
-7100001111111100011111001
+0000000000000000000000000
-0100000001111111100000000
数的范围-127~+127-127~+127-128~+127

负数补码转换成十进制:最高位不动,其余位取反加1。例:补码 11111001 → 取反 10000110 → 加1 得 -7。

第11页:标识符命名规则

§2.1 C的基本元素 —— 标识符 Identifiers

组成
只能由字母、数字、下划线组成,且第一个字符必须是字母或下划线;大小写敏感;不能使用关键字
长度
最长32个字符
命名原则
常用取简、专用取繁、见名知意;不宜混淆如 l 与 I、o 与 0

C的基本符号:字母26个(大小写敏感)、数字10个(0~9)、特殊符号(; ( ) < > "" '' # { } _ \\ % : + - * / 等)。

标识符合法性判断示例:sum、Sum、day、Date、student_name、lotus_1_2_3 合法;M.D.John、3days、#33、$123、a>b、int 不合法。

第12页:关键字空白字符与注释

§2.1 C的基本元素

关键字 Keywords
由系统内部使用,不能重作其他定义;C关键字共有32个(按用途排列:char int short long float double signed unsigned const struct union enum typedef sizeof void if else switch case default while do for break continue goto return auto register static extern volatile)
空白字符 White space
标识符之间、行与行之间的 blanks、tab、newlines 等,用于提高可读性,编译时不产生代码
注释 Comments
可多行注释,辅助记忆阅读和理解,不产生编译代码

第13页:分隔符

分隔符 Delimiters(§2.1 C的基本元素):用于分隔C程序中的各类语法成分,如空格、逗号、分号、括号等,使编译器能够正确识别标识符与语句边界。

第14页:数据类型体系总览

§2.2 C data types:数据类型决定——1. 数据占内存字节数;2. 数据取值范围;3. 其上可进行的操作。

  • 基本类型 Basic:字符型 char、整型 int、实型(float / double)、枚举 enum
  • 构造类型 Composite:数组 Array、结构体 Struct、共用体 Union
  • 指针类型 Pointer
  • 空类型 void
  • 定义类型 typedef

第15页:四种基本数据类型与修饰符

4 basic data types in C:字符型 char、整型 int、单精度浮点型 float、双精度浮点型 double。

4 additional qualifiers 类型修饰符:short、long、signed、unsigned。

修饰符与 int、char 组合可派生出更丰富的类型。

第16页:基本数据类型总表

基本数据类型总表:

C基本数据类型总表
类型关键字位数取值范围
整型(signed)int16/32-32768~32767
短整型(signed)short16-32768~32767
长整型(signed)long32-2147483648~2147483647
无符号整型unsigned int16/320~65535 / 0~2³²-1
无符号短整型unsigned short160~65535
无符号长整型unsigned long320~2³²-1
字符型char8-128~127
无符号字符型unsigned char80~255
单精度实型float32-3.4e-38~3.4e38,有效数字7位
双精度实型double64-1.7e-308~1.7e308,有效数字15位

整型按二进制补码存储,字符型按 ASCII 码存储;实型由符号位、尾数与阶数构成,具体界限参见 limits.h 与 float.h。

第17页:常量与符号常量

§2.3 常量与变量

常量 Constants
程序运行时其值不能改变的量,分为整型常量、浮点型常量、字符常量、字符串常量
符号常量 Symbolic constants
用标识符代表常量,#define identifier token-sequence;一般用大写字母,是宏定义预处理命令而非C语句

使用符号常量的好处:1. 提高可读性;2. 易于修改。

示例:#define PRICE 30、#define PI 3.14

第18页:整型常量的三种形式

整型常量的三种形式:

  • 十进制 Decimal:由数字0~9和正负号表示,如 123、-456、0
  • 八进制 Octal:以数字0开头,后跟0~7,如 0123、011
  • 十六进制 Hexadecimal:以 0x 或 0X 开头,后跟 0~9、a~f、A~F,如 0x123、0Xff

类型规则:无后缀时按其值所在范围确定类型;后缀 u/U 为 unsigned int,后缀 l/L 为 long int。

练习:0377 = 255,0x123 = 291,0Xff = 255(均为十进制)。

第19页:浮点型常量的两种形式

浮点型常量的两种形式:

  • 十进制形式 Decimal:必须有小数点,如 0.123、.123、123.0、0.0、123.
  • 指数形式 Exponential:e或E之前必须有数字,指数必须为整数,如 12.3e3、123E2、1.23e4、1.2E-3.5(不合法)

类型规则:默认为 double;后缀 f/F 为 float;后缀 l/L 为 long double。

第20页:字符常量与转义字符

字符常量:用单引号括起来的单个普通字符或转义字符,其值为该字符的 ASCII 码值。

例:'A' 为 65,'a' 为 97,'0' 为 48,'\n' 为 10;'\\101'、'\\x41' 均表示 'A';'\012' 表示 '\n'。

转义字符:反斜线后跟一个字符或代码值,如 \n 换行、\r 回车不换行、\t 水平制表、\\\ 反斜线、\\' 单引号、\\" 双引号、\v 垂直制表、\b 退格、\f 换页、\\a 响铃、\\ooo 三位八进制、\\xhh 二位十六进制、\0 空字符。

第21页:

本页源文件未提取到文字内容,仅有图片(源文件此处为空段)。建议对照原课件图片补充本页要点说明。

第22页:

第23页:字符串常量

字符串常量:用双引号括起来的零个或多个字符序列(含转义字符),数据类型为字符数组。存储时每个字符串尾自动加一个 '\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"; 错误。

第24页:变量与内存

变量 Variables:程序运行中其值可以改变的量,是对程序中数据存储空间的抽象,程序中使用变量名对内存操作。

例:int a; 分配2字节单元,a=100; 把100存入该单元。

第25页:变量的名字类型与值

变量:每个变量有名字和类型,变量值是变量名对应的内存单元中存放的数据。

例:int a; a=1; 中 a 占2字节内存单元,存放数据1。

第26页:变量定义与初始化

变量定义 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 报错。

变量定义位置:一般放在函数内第一条可执行语句前面或函数外。

第27页:整型实型与字符型变量

变量类型

整型变量
占字节数与机器硬件有关,一般占一个机器字;short ≤ int ≤ long;可用 sizeof(类型标识符|变量名) 测量
浮点型变量
float 4字节,double 8字节,long double 8/10字节
字符型变量
其值为 ASCII 码值,char 与 int 可进行算术运算

C中没有字符串型变量,字符串用字符数组存放。

例:a='0'; 即 a=48;x='A'+5 即 70;s='!'+'G' 即 104。

第28页:变量手工模拟示例

手工模拟:

#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'。

第29页:字符型与整型的区别

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位。

第30页:隐式类型转换

§2.4 数据类型转换:程序运行中数据由一种类型改变成另一种类型。

隐式转换(自动转换)发生场景:

  • 算术转换:不同类型数据混合运算时
  • 赋值转换:把一个值赋给与其类型不同的变量时
  • 输出转换:输出时转换成指定的输出格式
  • 函数调用转换:实参与形参类型不一致时

运算转换规则:不同类型数据运算时先自动转换成同一类型。

第31页:算术转换规则

算术转换规则: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 型。

第32页:强制类型转换

显式转换(强制转换):(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

第33页:运算符总览34个

§2.5 运算符与表达式:运算符 operator 与运算量 operand 构成表达式。

Operators: 34:算术 + - * / % ++ --;关系 < <= == > >= !=;逻辑 ! && ||;位 << >> ~ | ^ &;赋值 = *= /= %= += -= <<= >>= &= ^= |=;条件 ?:;逗号 ,;指针 * &;求字节 sizeof;强制类型转换 (type);分量 . ->;下标 [ ];其他 ( )

第34页:运算符的学习要点

运算符的学习要点:

  • 运算符功能
  • 与运算量关系:要求运算量个数(1~3个)与类型
  • 运算符优先级别(共15级)
  • 结合方向:优先级相同时运算符与运算量的结合方向
  • 结果的类型

表达式 Expressions:运算符与运算量的组合式,变量和常量都是表达式,表达式都有值和类型。

第35页:基本算术运算符

基本算术运算符:+ - * / %,双目运算符,结合方向从左向右。

优先级:-(单目)(2) → * / % (3) → + -(双目)(4),括号 ( ) 内优先级最高 (1)。

  • 两整数相除结果向零取整:5/2 = 2,-5/2.0 = -2.5
  • % 要求两侧均为整型:5%2 = 1,-5%2 = -1,1%10 = 1,5%1 = 0,5.5%2 非法

第36页:自增自减运算符

自增、自减运算符 ++ --:使变量值加1或减1,单目运算符。

前置 ++i, --i
先执行 i+1 或 i-1,再使用 i 值
后置 i++, i--
先使用 i 值,再执行 i+1 或 i-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

第37页:自增自减使用注意

自增、自减运算符使用说明:

  • ++ -- 不能用于常量和表达式,如 5++、(a+b)++ 均非法
  • 前置与后置运算区别在于其表达式的值不同
  • 结合方向自右向左,优先级 (2)
  • 程序中尽量不要写容易引起歧义的表达方式,如 j+++k 应写作 (j++)+k

例:-i++ 等价于 -(i++);i=3 时 printf("%d", -i++) 输出 -3。

第38页:赋值运算符

基本赋值运算符: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。

第39页:赋值转换与嵌套

赋值运算符说明:

  • 赋值运算符左面必须是变量,不能是常量或表达式(3=x-2*y 非法)
  • 赋值表达式可嵌套,其值与变量值相等
  • 左右类型不同时自动进行赋值转换:右边表达式值转换成左边变量的类型

例: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

第40页:复合赋值运算示例

复合赋值嵌套示例:

  • a=12; a+=a-=a*a; 等价于 a=a+(a=a-(a*a)),结果 a=-264
  • int a=2; a%=4-1; a+=a*=a-=a*=3; 等价于 a=a+(a=a*(a=a-(a=a*3))),结果 a=0
  • int a=2,c=3; a*=5+(c%=a); 结果 a=12, c=1

嵌套赋值应从右向左逐步展开,避免书写歧义。

第41页:逗号运算符与表达式

逗号运算符:exp1, exp2 [, … , expn]

  • 作用:顺序计算表达式1~n的值
  • 结合性:从左向右;优先级:15(最低)
  • 逗号表达式的值:等于表达式n的值
  • 用途:常用于变量定义和循环语句中

例: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

第42页:逗号运算程序示例

#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。

第43页:关系运算符与表达式

关系运算符:< <= == >= > !=,用于比较两个数值,双目运算符,结合方向自左向右。

优先级别:< <= > >= 为 (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)

第44页:关系运算示例

关系运算示例:设 int a=3, b=2, c=1, d, f;

  • a>b → 1
  • (a>b)==c → 1
  • b+c<a → 0
  • d=a>b → d=1
  • f=a>b>c → f=0

第45页:关系运算注意点

关系运算注意:

  • 连续比较按从左到右求值:a=0, b=0.5, x=0.3 时 a<=x<=b 的值为0
  • C中 5>2>7>8 合法,值为0
  • int i=1, j=7, a; a=i+(j%4!=0); 则 a=2
  • 'a'>0 值为1,'A'>100 值为0
  • 注意区分「=」赋值与「==」比较:if(a=b) 是把 b 赋给 a 后判断 a 是否非0

第46页:逻辑运算符概览

逻辑运算符:&& || !,用于构造复杂表达式。

例: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

第47页:逻辑运算真值表

逻辑运算真值表:C语言中运算量 0 为「假」、非0为「真」;运算结果 0 为「假」、1为「真」。

逻辑运算真值表
ab!a!ba&&ba||b
真真假假真真
真假假真假真
假真真假假真
假假真真假假

第48页:逻辑运算示例

逻辑运算示例:设 a=4, b=5;

  • !a → 0
  • a&&b → 1
  • a||b → 1
  • !a||b → 1
  • 4&&0||2 → 1
  • 5>3&&2||8<4-!0 → (5>3)&&2||(8<(4-(!0))) → 1
  • 'c'&&'0' → 1

第49页:逻辑运算短路特性

短路特性:逻辑表达式求解时并非所有逻辑运算符都被执行,只在必须执行下一个运算符才能求出表达式解时才执行。

  • a&&b&&c:只在 a 为真时才判别 b;只在 a、b 都为真时才判别 c
  • a||b||c:只在 a 为假时才判别 b;只在 a、b 都为假时才判别 c

例: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 未被执行)。

第50页:条件运算符

条件运算符:expr1 ? expr2 : expr3,三目运算符,优先级13,结合方向自右向左。

执行过程:先判断 expr1,非0取 expr2 的值,为0取 expr3 的值。

  • 求绝对值:(x>=0)?x:-x
  • 判断奇偶:(x%2==1)?1:0
  • 小写转大写:(c>='a'&&c<='z')?c-'a'+'A':c

例:a>b?a:c>d?c:d 等价于 a>b?a:(c>d?c:d)

第51页:第二章本章小结

本章小结:C语言组成的基本元素(标识符、关键字、空白字符、注释、分隔符、常量、运算符);基本数据类型(int、short、long、unsigned 系列、float、double、char、unsigned char);常量与变量(符号常量与直接常量,含整型、实型、字符型、字符串常量);数据类型转换(强制转换与自动转换,含运算转换、赋值转换、输出转换、函数调用转换);运算符和表达式的使用(算术、赋值、逗号、关系、逻辑、条件运算符)。

第52页:整型数据的极值表示

整型数据的表示范围(二进制补码):

  • int 最大值 32767 = 2¹⁵-1,位模式 01 11 11 11 11 11 11 11
  • int 最小值 -32768 = -2¹⁵,位模式 10 00 00 00 00 00 00 00
  • unsigned int 最大值 65535 = 2¹⁶-1,位模式 11 11 11 11 11 11 11 11
  • unsigned int 最小值 0,位模式 00 00 00 00 00 00 00 00

第53页:四种数制对照表

数制的基、权、数码与特点:

常用数制对照表
数制数码基权特点
十进制数0~91010⁰,10¹,10²,…逢十进一
二进制数0~122⁰,2¹,2²,…逢二进一
八进制数0~788⁰,8¹,8²,…逢八进一
十六进制数0~9, A~F, a~f1616⁰,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⁰。

顶部目录