C语言8 位域、联合、枚举、定义类型及预处理功能
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计 10
特殊的结构体: 特殊的结构体: 位段
一个字的某些位有指定的信息, 一个字的某些位有指定的信息,可以通过位操作将信 息提取出来,更简单有效的方法是给位取名字( 息提取出来,更简单有效的方法是给位取名字(定义 位段),用名字操作. ),用名字操作 位段),用名字操作. struct bs { unsigned a:2; unsigned b:6; }bsa[10]; void main(){ int i,j=1; for(i=0;i<10;i++){ bsa[i].a=7; bsa[i].b=j<<=1; } }
C语言程序设计 13
宏定义 #define 命令
不带参数的宏定义 用一个指定的标志符(即宏名)来代表一个字符串. 用一个指定的标志符(即宏名)来代表一个字符串. 它的一般形式为: 它的一般形式为: #define 标志符 字符串 如:#define PI 3.1415926 说明: 说明: ① 宏名一般全部用大写字母表示,以与变量名区别; 宏名一般全部用大写字母表示,以与变量名区别; 使用宏定义, ② 使用宏定义,可以减少输入程序时重复书写某些字符串的 工作量,也可以提高程序的通用性; 工作量,也可以提高程序的通用性; 宏定义是用宏名代替一个字符串,在进行预处理时, ③ 宏定义是用宏名代替一个字符串,在进行预处理时,只是 进行简单的替换,并不进行语法正确性检查. 进行简单的替换,并不进行语法正确性检查.只有正式编译 已经宏替换之后的源程序时才会检查并报错
C语言程序设计
按位或 10010111
⊥
4
^ 按位异或 二目运算
左结合
异或 是一种逻辑运算,C中没有运算符表示. 是一种逻辑运算, 中没有运算符表示. 逻辑是:相同返回逻辑值0 不同返回逻辑值1 逻辑是:相同返回逻辑值0,不同返回逻辑值1 1⊕1 ---- 0 0⊕1 ---- 1 1⊕0 ---- 1 0⊕0 ---- 0 按位异或 把整数的对应位作为逻辑值,进行异或运算,结果 把整数的对应位作为逻辑值,进行异或运算, 是整数值. 常用于给字中某些位 求同/异 求同/ 是整数值. ----94 1--93 ^ 7 ----94 0 ^ 1--- 1 1 ^
struct packed_data { unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; } // // // // a占 a占2个bits b占 b占6个bits c占 c占4个bits d占 d占4个bits
定义方法: unsigned, 名字: 占的位数, 定义方法 : 类型 unsigned , 名字 : 占的位数 , 从 低位到高位, 低位到高位,从低字节到字节 即可访问变量x 用位段类型定义一个变量 x , 即可访问变量 x 的特 定位. 定位. 内存分配还是以字节为基本单位,Win98 98, 内存分配还是以字节为基本单位, Win98,2000 以 4 字节单位. 字节单位.定义位段往往会浪费内存空间
C语言程序设计 16
文件包含 #include 命令
说明: 说明:
③ 在#include命令中,文件名可以用双引号或者是尖括 #include命令中 命令中, 号括起来.二者的区别是: 号括起来.二者的区别是: ● 用尖括号<>:进行预处理时,到由IDE集成开发环境 用尖括号<> 进行预处理时,到由IDE <>: IDE集成开发环境 Directory" 中 "Include Directory"选项设置的目录中去寻找要 包含的文件;找到则包含,没找到则报告出错信息; 包含的文件;找到则包含,没找到则报告出错信息; ● 用双引号"" :进行预处理时,编译系统首先在当 用双引号"" 进行预处理时, 前目录下寻找要包含的文件;找到则包含; 前目录下寻找要包含的文件;找到则包含;如果没有找 则再到由IDE IDE集成开发环境中 Directory" 到,则再到由IDE集成开发环境中 "Include Directory" 选项设置的目录中去寻找要包含的文件;找到则包含, 选项设置的目录中去寻找要包含的文件;找到则包含, 如果还没找到则报告出错信息. 如果还没找到则报告出错信息.
93 7
|
0---0----1 ----1
0 | 0 --- 0
16进数演示 16进数演示
10010011 00000111 97
码最高位置1 例:'A'的ASCII码最高位置1,扩展 的ASCII码最高位置 出的字符是什么? 出的字符是什么? printf("%c , A | printf( %c", 'A'| 0x80); %c
值 12288 值57
3
| 按位或 二目运算
左结合
或逻辑 把运算数作为逻辑值,进行或运算,结果是逻辑值 把运算数作为逻辑值,进行或运算, ----1 3.4--93 || 7 ----1 0 || 3.4--- 1 "12" || 0----1 12" 0-------1 0 || 0 --- 0 按位或 把整数的对应位作为逻辑值,进行或运算,结果是 把整数的对应位作为逻辑值,进行或运算, 整数值. 整数值. 常用于给字中某些位 置1 ----97 1--93 | 7 ----97 0 | 1--- 1 1
>> 右移位 把操作符前边的整数右移 操作符后边的整数指 常用于除2方次快速计算, 出的位数 常用于除2方次快速计算,取出某 些连续位 ----8 2---------4 16 >> 1 ----8 16>> 2-----4 ----2 16进数演示 16 >> 3 ----2 16进数演示
16 >>1 >>2 >>3 00001000 00000100 00000010 00000001 最高位移入0 最高位移入0
C语言程序设计 7
1 << 2-----4 2---------4
16进数演示 16进数演示
例:short a=123 乘16 a<<4
>> 右移位 二目运算
/ 运算
左结合
数除以2 数除以2的方次 ----8 /2--16 / 2 ----8 16 /2 /2--- 4 ----2 16/ 2/2 / 2 ----2
C语言程序设计 11
8.3
预处理命令
define 预处理命令 include 预处理命令
C语言程序设计
12
预处理命令
◆ 预处理命令并不是C语言本身的组成部分,不能直接对它 预处理命令并不是C语言本身的组成部分, 们进行编译,必须由预处理器来识别. 们进行编译,必须由预处理器来识别. ◆ 在对程序进行通常的编译前,先由预处理器识别处理其中 在对程序进行通常的编译前, 预处理命令" 如进行宏替换,包含文件等等. 的"预处理命令",如进行宏替换,包含文件等等. ◆ 处理完所有的" 预处理命令"后,程序中不再包括预处 处理完所有的" 预处理命令" 理 命令,编译系统再对预处理后的程序进行通常的编译. 命令,编译系统再对预处理后的程序进行通常的编译. 主要有以下三种: ◆ C语言 " 预处理命令 " 主要有以下三种: 1. 宏定义 2. 文件包含 3. 条件编译 C语言中的"预处理命令"都以符号"#"开头 语言中的"预处理命令"都以符号"
C语言程序设计 14
宏定义 #define 命令
说明: 说明: ④ 宏定义命令不是C语句,所以不能在后面加 ;分 宏定义命令不是C语句, 如果加上,会连分号一起被替换到源程序中; 号.如果加上,会连分号一起被替换到源程序中; ⑤ #define 命令出现在程序中所有函数的外面,宏 命令出现在程序中所有函数的外面, 名的有效范围为#define #define命令开始到该源程序文件结 名的有效范围为#define命令开始到该源程序文件结 束.也可以用 #undef 命令结束宏定义的作用域; 命令结束宏定义的作用域; ⑥ 在进行宏定义时,可以引用已经定义的宏名; 在进行宏定义时,可以引用已经定义的宏名; ⑦ 对于源程序中出现在用双引号括起来的字符串常 量中的字符,即使与宏名相同,也不进行宏替换. 量中的字符,即使与宏名相同,也不进行宏替换.
C语言程序设计
第八章 位域,联合,枚举,定义类型 及预处理功能
C语言程序设计
1
8.1 位运算符和位运算
& 按位与 | 按位或 ~ 按位反 << 左移 >> 右移
2
∧按位异或
C语言程序设计
& 按位与 二目运算 左结合
与逻辑 把运算数作为逻辑值,进行与运算,结果是逻辑值 把运算数作为逻辑值,进行与运算, ----1 3.4--93 && 7 ----1 0 && 3.4--- 0 "12" && 0----0 12" 0-------0 0 && 0 --- 0 按位与 把整数的对应位作为逻辑值,进行与运算,结果是 把整数的对应位作为逻辑值,进行与运算, 整数值. 整数值. 常用于从字中取出某些位 ----3 1--93 & 7 ----3 0 & 1--- 0 1
~0
--- ff
16进数演示 16进数演示
93
10010011 6c
a=12345的反码 的反码, 例:short a=12345的反码, b的补码 b = -a, b的补码 -a,-a+1
C语言程序设计 6
按位反01101100
<< 左移位 二目运算
* 运算
左结合
数乘以2 数乘以2的方次 ----2 *2--1 * 2 ----2 1 * 2 *2--- 4 ----8 1 * 2 * 2 * 2 ----8
93 7
&
0---0----0 ----0
0 & 0 --- 0 16进数演示 16进数演示 例:short a=12345; 问其高位字节, 问其高位字节,低位字节的来自百度文库是多少
10010011 00000111 3
按位与 00000011
高位字节 a & 0xff00 低位字节 a & 0xff
C语言程序设计
93 7
0---0----1 ----1
0 ^ 0 --- 0
16进数演示 16进数演示
10010011 00000111 94
C语言程序设计
x='1 的偶 例:把 char x= 1'的偶 数位变反, 数位变反,奇数位保持 用10101010 异或 x : x^ 0xaa
5
按位异或 10010100
C语言程序设计
15
文件包含 #include 命令
所谓"文件包含",是指一个源程序文件可以把另一个 所谓"文件包含" 源程序文件的全部内容包含进来, 源程序文件的全部内容包含进来,即把另外的文件包含 到本文件中. 到本文件中. "文件包含"命令的一般形式为: 文件包含"命令的一般形式为: <文件名 文件名> 文件名" #include <文件名> 或: #include "文件名" 比如: 比如: #include <stdio.h> #include <string.h> myheader.h" file1.c" #include "myheader.h" #include "file1.c" 说明: 说明: ① 一个#include命令只能包含一个文件; 一个#include命令只能包含一个文件; 命令只能包含一个文件 被包含文件与包含它的文件, ② 被包含文件与包含它的文件,在预处理后已经被编译 系统理解成为一个文件进行编译. 系统理解成为一个文件进行编译.
例:short a=123 除16: 高位字节: 高位字节:a>>8
a>>4
低位字节: 低位字节:a<<8 >>16
C语言程序设计 8
8.2 位段
C语言寻址的最小单位是字节 要访问字节中的位, 要访问字节中的位,要用到 特殊的结构体: 特殊的结构体: 位段
C语言程序设计
9
特殊的结构体: 特殊的结构体: 位段
<< 左移位 把操作符前边的整数 左移 操作符后边的整数 常用于乘2 指出的位数 常用于乘2方次快速计算 1 << 1 ----2 ----2 ----8 1 << 3 ----8
最低位移入0 最低位移入0 1 <<1 <<2 <<3 00000001 00000010 00000100 00001000
~ 按位反 单目运算
左结合
非逻辑 把运算数作为逻辑值,进行非运算,结果是逻辑值 把运算数作为逻辑值,进行非运算, ----0 !93 ----0 !0 --- 1 按位反 把整数的各位作为逻辑值,进行非运算,结果是 把整数的各位作为逻辑值,进行非运算, 整数值. 整数值. 常用于给字中各位 求反
~93 ----6c ----6c
特殊的结构体: 特殊的结构体: 位段
一个字的某些位有指定的信息, 一个字的某些位有指定的信息,可以通过位操作将信 息提取出来,更简单有效的方法是给位取名字( 息提取出来,更简单有效的方法是给位取名字(定义 位段),用名字操作. ),用名字操作 位段),用名字操作. struct bs { unsigned a:2; unsigned b:6; }bsa[10]; void main(){ int i,j=1; for(i=0;i<10;i++){ bsa[i].a=7; bsa[i].b=j<<=1; } }
C语言程序设计 13
宏定义 #define 命令
不带参数的宏定义 用一个指定的标志符(即宏名)来代表一个字符串. 用一个指定的标志符(即宏名)来代表一个字符串. 它的一般形式为: 它的一般形式为: #define 标志符 字符串 如:#define PI 3.1415926 说明: 说明: ① 宏名一般全部用大写字母表示,以与变量名区别; 宏名一般全部用大写字母表示,以与变量名区别; 使用宏定义, ② 使用宏定义,可以减少输入程序时重复书写某些字符串的 工作量,也可以提高程序的通用性; 工作量,也可以提高程序的通用性; 宏定义是用宏名代替一个字符串,在进行预处理时, ③ 宏定义是用宏名代替一个字符串,在进行预处理时,只是 进行简单的替换,并不进行语法正确性检查. 进行简单的替换,并不进行语法正确性检查.只有正式编译 已经宏替换之后的源程序时才会检查并报错
C语言程序设计
按位或 10010111
⊥
4
^ 按位异或 二目运算
左结合
异或 是一种逻辑运算,C中没有运算符表示. 是一种逻辑运算, 中没有运算符表示. 逻辑是:相同返回逻辑值0 不同返回逻辑值1 逻辑是:相同返回逻辑值0,不同返回逻辑值1 1⊕1 ---- 0 0⊕1 ---- 1 1⊕0 ---- 1 0⊕0 ---- 0 按位异或 把整数的对应位作为逻辑值,进行异或运算,结果 把整数的对应位作为逻辑值,进行异或运算, 是整数值. 常用于给字中某些位 求同/异 求同/ 是整数值. ----94 1--93 ^ 7 ----94 0 ^ 1--- 1 1 ^
struct packed_data { unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; } // // // // a占 a占2个bits b占 b占6个bits c占 c占4个bits d占 d占4个bits
定义方法: unsigned, 名字: 占的位数, 定义方法 : 类型 unsigned , 名字 : 占的位数 , 从 低位到高位, 低位到高位,从低字节到字节 即可访问变量x 用位段类型定义一个变量 x , 即可访问变量 x 的特 定位. 定位. 内存分配还是以字节为基本单位,Win98 98, 内存分配还是以字节为基本单位, Win98,2000 以 4 字节单位. 字节单位.定义位段往往会浪费内存空间
C语言程序设计 16
文件包含 #include 命令
说明: 说明:
③ 在#include命令中,文件名可以用双引号或者是尖括 #include命令中 命令中, 号括起来.二者的区别是: 号括起来.二者的区别是: ● 用尖括号<>:进行预处理时,到由IDE集成开发环境 用尖括号<> 进行预处理时,到由IDE <>: IDE集成开发环境 Directory" 中 "Include Directory"选项设置的目录中去寻找要 包含的文件;找到则包含,没找到则报告出错信息; 包含的文件;找到则包含,没找到则报告出错信息; ● 用双引号"" :进行预处理时,编译系统首先在当 用双引号"" 进行预处理时, 前目录下寻找要包含的文件;找到则包含; 前目录下寻找要包含的文件;找到则包含;如果没有找 则再到由IDE IDE集成开发环境中 Directory" 到,则再到由IDE集成开发环境中 "Include Directory" 选项设置的目录中去寻找要包含的文件;找到则包含, 选项设置的目录中去寻找要包含的文件;找到则包含, 如果还没找到则报告出错信息. 如果还没找到则报告出错信息.
93 7
|
0---0----1 ----1
0 | 0 --- 0
16进数演示 16进数演示
10010011 00000111 97
码最高位置1 例:'A'的ASCII码最高位置1,扩展 的ASCII码最高位置 出的字符是什么? 出的字符是什么? printf("%c , A | printf( %c", 'A'| 0x80); %c
值 12288 值57
3
| 按位或 二目运算
左结合
或逻辑 把运算数作为逻辑值,进行或运算,结果是逻辑值 把运算数作为逻辑值,进行或运算, ----1 3.4--93 || 7 ----1 0 || 3.4--- 1 "12" || 0----1 12" 0-------1 0 || 0 --- 0 按位或 把整数的对应位作为逻辑值,进行或运算,结果是 把整数的对应位作为逻辑值,进行或运算, 整数值. 整数值. 常用于给字中某些位 置1 ----97 1--93 | 7 ----97 0 | 1--- 1 1
>> 右移位 把操作符前边的整数右移 操作符后边的整数指 常用于除2方次快速计算, 出的位数 常用于除2方次快速计算,取出某 些连续位 ----8 2---------4 16 >> 1 ----8 16>> 2-----4 ----2 16进数演示 16 >> 3 ----2 16进数演示
16 >>1 >>2 >>3 00001000 00000100 00000010 00000001 最高位移入0 最高位移入0
C语言程序设计 7
1 << 2-----4 2---------4
16进数演示 16进数演示
例:short a=123 乘16 a<<4
>> 右移位 二目运算
/ 运算
左结合
数除以2 数除以2的方次 ----8 /2--16 / 2 ----8 16 /2 /2--- 4 ----2 16/ 2/2 / 2 ----2
C语言程序设计 11
8.3
预处理命令
define 预处理命令 include 预处理命令
C语言程序设计
12
预处理命令
◆ 预处理命令并不是C语言本身的组成部分,不能直接对它 预处理命令并不是C语言本身的组成部分, 们进行编译,必须由预处理器来识别. 们进行编译,必须由预处理器来识别. ◆ 在对程序进行通常的编译前,先由预处理器识别处理其中 在对程序进行通常的编译前, 预处理命令" 如进行宏替换,包含文件等等. 的"预处理命令",如进行宏替换,包含文件等等. ◆ 处理完所有的" 预处理命令"后,程序中不再包括预处 处理完所有的" 预处理命令" 理 命令,编译系统再对预处理后的程序进行通常的编译. 命令,编译系统再对预处理后的程序进行通常的编译. 主要有以下三种: ◆ C语言 " 预处理命令 " 主要有以下三种: 1. 宏定义 2. 文件包含 3. 条件编译 C语言中的"预处理命令"都以符号"#"开头 语言中的"预处理命令"都以符号"
C语言程序设计 14
宏定义 #define 命令
说明: 说明: ④ 宏定义命令不是C语句,所以不能在后面加 ;分 宏定义命令不是C语句, 如果加上,会连分号一起被替换到源程序中; 号.如果加上,会连分号一起被替换到源程序中; ⑤ #define 命令出现在程序中所有函数的外面,宏 命令出现在程序中所有函数的外面, 名的有效范围为#define #define命令开始到该源程序文件结 名的有效范围为#define命令开始到该源程序文件结 束.也可以用 #undef 命令结束宏定义的作用域; 命令结束宏定义的作用域; ⑥ 在进行宏定义时,可以引用已经定义的宏名; 在进行宏定义时,可以引用已经定义的宏名; ⑦ 对于源程序中出现在用双引号括起来的字符串常 量中的字符,即使与宏名相同,也不进行宏替换. 量中的字符,即使与宏名相同,也不进行宏替换.
C语言程序设计
第八章 位域,联合,枚举,定义类型 及预处理功能
C语言程序设计
1
8.1 位运算符和位运算
& 按位与 | 按位或 ~ 按位反 << 左移 >> 右移
2
∧按位异或
C语言程序设计
& 按位与 二目运算 左结合
与逻辑 把运算数作为逻辑值,进行与运算,结果是逻辑值 把运算数作为逻辑值,进行与运算, ----1 3.4--93 && 7 ----1 0 && 3.4--- 0 "12" && 0----0 12" 0-------0 0 && 0 --- 0 按位与 把整数的对应位作为逻辑值,进行与运算,结果是 把整数的对应位作为逻辑值,进行与运算, 整数值. 整数值. 常用于从字中取出某些位 ----3 1--93 & 7 ----3 0 & 1--- 0 1
~0
--- ff
16进数演示 16进数演示
93
10010011 6c
a=12345的反码 的反码, 例:short a=12345的反码, b的补码 b = -a, b的补码 -a,-a+1
C语言程序设计 6
按位反01101100
<< 左移位 二目运算
* 运算
左结合
数乘以2 数乘以2的方次 ----2 *2--1 * 2 ----2 1 * 2 *2--- 4 ----8 1 * 2 * 2 * 2 ----8
93 7
&
0---0----0 ----0
0 & 0 --- 0 16进数演示 16进数演示 例:short a=12345; 问其高位字节, 问其高位字节,低位字节的来自百度文库是多少
10010011 00000111 3
按位与 00000011
高位字节 a & 0xff00 低位字节 a & 0xff
C语言程序设计
93 7
0---0----1 ----1
0 ^ 0 --- 0
16进数演示 16进数演示
10010011 00000111 94
C语言程序设计
x='1 的偶 例:把 char x= 1'的偶 数位变反, 数位变反,奇数位保持 用10101010 异或 x : x^ 0xaa
5
按位异或 10010100
C语言程序设计
15
文件包含 #include 命令
所谓"文件包含",是指一个源程序文件可以把另一个 所谓"文件包含" 源程序文件的全部内容包含进来, 源程序文件的全部内容包含进来,即把另外的文件包含 到本文件中. 到本文件中. "文件包含"命令的一般形式为: 文件包含"命令的一般形式为: <文件名 文件名> 文件名" #include <文件名> 或: #include "文件名" 比如: 比如: #include <stdio.h> #include <string.h> myheader.h" file1.c" #include "myheader.h" #include "file1.c" 说明: 说明: ① 一个#include命令只能包含一个文件; 一个#include命令只能包含一个文件; 命令只能包含一个文件 被包含文件与包含它的文件, ② 被包含文件与包含它的文件,在预处理后已经被编译 系统理解成为一个文件进行编译. 系统理解成为一个文件进行编译.
例:short a=123 除16: 高位字节: 高位字节:a>>8
a>>4
低位字节: 低位字节:a<<8 >>16
C语言程序设计 8
8.2 位段
C语言寻址的最小单位是字节 要访问字节中的位, 要访问字节中的位,要用到 特殊的结构体: 特殊的结构体: 位段
C语言程序设计
9
特殊的结构体: 特殊的结构体: 位段
<< 左移位 把操作符前边的整数 左移 操作符后边的整数 常用于乘2 指出的位数 常用于乘2方次快速计算 1 << 1 ----2 ----2 ----8 1 << 3 ----8
最低位移入0 最低位移入0 1 <<1 <<2 <<3 00000001 00000010 00000100 00001000
~ 按位反 单目运算
左结合
非逻辑 把运算数作为逻辑值,进行非运算,结果是逻辑值 把运算数作为逻辑值,进行非运算, ----0 !93 ----0 !0 --- 1 按位反 把整数的各位作为逻辑值,进行非运算,结果是 把整数的各位作为逻辑值,进行非运算, 整数值. 整数值. 常用于给字中各位 求反
~93 ----6c ----6c