自考计算机基础与程序设计11
更新时间:2023-07-22 02:08:01 阅读量: 实用文档 文档下载
第九章
位运算与预处理
第一节 位运算 第二节 宏定义 第三节 文件包含 第四节 预编译
共 26 页
第 2 页
运算符
() 括号 单目运算符 算术运算符 关系运算符 逻辑运算符 条件运算符
改变表达式中的优先级关系
++;--;!;-(负),*(指针),&(取地址) *;/;% +;>;<;>=;<= ==;!= && || ?:
高
赋值运算符逗号运算符
=;+=;-=;*=;/=;%=,低
位运算符
将参与运算的两个操作数,按对应的二进制位分别进行以下运算
&按位与
|按位或
~
^
<<位左移
>>位右移
按位取反 按位异或
2)算术表达式的格式: ~是单目运算符:~a 其余都是双目运算符 :a&b,a|b,a<<2,b>>2 3)操作步骤 1)将运算分量转化为二进制(默认8位二进制)转化时右端对齐,如果位数不够,左边补符号位,即正数补0,负数补1. int a=3, b=5,d; d=a&b ?
a 0000 0011
b 0000 0101
2)再针对每个二进制位进行位运算 3)运算后的结果转回为十进制
位运算符
操作步骤 1)将运算分量转化为二进制(默认8位二进制) 2)再针对每个二进制位进行位运算 3)结果转回十进制
1.按位与--& 按位与运算:如果两个对应的位都是1,则该位为1,否则为0.int a=3, b=5,d; d=a&b ?
0000 0011 1 & 0000 0101 0000 0 00 1
1)将a,b转化二进制 2)进行位与运算 3)将结果转回十进制
位运算符
操作步骤 1)将运算分量转化为二进制(默认8位二进制) 2)再针对每个二进制位进行运算 3)结果转回十进制
2.按位或--| 按位或运算:如果两个对应的位有一个1,则该位为1,否则为0.int a=3, b=5,d; d=a|b ?
0000 0011 7 | 0000 0101 0000 0 11 1
1)将a,b转化二进制 2)进行位或运算 3)将结果转回十进制
位运算符
操作步骤 1)将运算分量转化为二进制(默认8位二进制) 2)再针对每个二进制位进行运算 3)结果转回十进制
3.按位异或--^ 按位异或运算:如果两个对应的位不同,则为1,否则为0.0000 0011int a=3,b=5,d; d=a^b ?
6
~
0000 0101 0000 0 11 0
1)将a转化二进制 2)进行位异或运算 3)将结果转回十进制
位运算符
操作步骤 1)将运算分量转化为二进制(默认8位二进制) 2)再针对每个二进制位进行运算 3)结果转回十进制
4.按位取反--~ 按位取反运算:如果位为1,则结果为0,如果位为0,结果为1. 注意:单目运算符,格式:~a~int a=5,b; b=~a ?
0000 0101 1111 1 01 0符号位为1, 说明是负数
-6转十进制
1)将a转化二进制 2)进行位取反运算 除符号外,位取反 1000 0101 3)将结果转回十进制 末尾+1 1000 0110
位运算符
操作步骤 1)将运算分量转化为二进制(默认8位二进制) 2)再针对每个二进制位进行运算 3)结果转回十进制
5.位左移(<<) 和位右移(>>) 将一个数的全部二进制位左移或右移若干位.格式:左边是移位处理的对象,右边是整数表达式,表
示移动多少位 a<<2 a>>220 1
0000 0101
int a=5,b; b=a<<2 ? b=a>>2;
a<<20001 0100 0000 0101 a>>2 0000 0001
1)左移时,低位补0 2)右移时,对于正数,高位补0,对于 负数,高位补1
位运算符
将参与运算的两个操作数,按对应的二进制位分别进行以下运算
~按位取反
&按位与
|
^
<<位左移
>>位右移
按位或 按位异或
3)优先级 ~取反 <<,>>位移 &位与 ^位异或 |位或 4)结合性:取反是自右向左 其余是自左向右 注意: 1)位运算都只能针对整数和字符型数据 2&3 2&3.0错误 2)位运算和赋值运算符一起构成复合赋值运算符 &=,|=,^=,<<=,>>=
位运算符举例: 0000 0011 int a=3,b=11;表达式~a&b结果? 8 ~a 1111 1100 0000 1011 0000 1000 0000 0011 int a=3,b=11;表达式a|b结果? | 0000 1011 0000 1011共 26 页 第 11 页
&
运算符高
() 括号 单目运算符 算术运算符 关系运算符 逻辑运算符 条件运算符
改变表达式中的优先级关系
++;--;!;-(负),*(指针),&(取地址),~ *;/;% +;- <<,>> >;<;>=;<= ==;!= & ^ | && || ?:
赋值运算符逗号运算符
=;+=;-=;*=;/=;%=,低
预处理C语言程序的执行过程:编写源程序(.c) 编译程序(.obj) 链接程序 可执行程序(.exe) 执行程序,获得结果
预处理:程序被编译以前,编译系统会先对程序中三种特殊的命令进行”预先处理”,然后将预处理结果和源程序进行编译. 宏定义 预处理
#define#include
用一个名字代替一个字符串 使用库函数时,包含相应头文件
文件包含 条件编译
#ifdef….#endif 按照不同条件选择编译不同的程序部分
预处理宏的使用:包括宏定义、宏调用和宏展开三部分1)编程人员为了缩短编写代码的长度,用宏定义说明用一个宏名 代替一个长的字符串。 例如:#define PI 3.1415926 2)在编程时,用到长字符串的地方用宏名替代,这个过程称为 例如:S=PI*r*r; 宏调用。 3) 在编译前,系统如何理解这些宏调用?根据宏定义,系统自动将 所有宏名换回长字符串,这个过程称为宏展开. 我们阅读别人编 写的宏调用也做这样的替换举例: #define PI 3.1415926 main() { int r=3;double s,d; d=2*PI*r; /*圆周长*/ S=PI*r*r; /*面积*/ } main() { int r=3;double s,d; d=2*3.1415926*r; /*圆周长*/ S=3.1415926*r*r; /*面积*/ }
预编译
宏展开
预处理 使用宏的意义:
举例: #define PI 3.1415926 main() { int r=3;double s,d; d=2*PI*r; /*圆周长*/ S=PI*r*r; /*面积*/ }
优点: 1)用短小有意义的名字代替一长 串的字符,减少输入量 2)便于修改.修改一个地方,则全 部修改
预处理宏分为:无参宏和带参宏
1)无参宏定义: 告诉系统,用标识符来表示一个字符序列宏定义命令 宏名,一般大写
常数,表达式
格式:#define
标识符
字符序列
不以分号结尾 定义符号常量的方法就是
分隔用空格 分隔用空格
宏定义写在函数的外面,一般在文件开头 一种宏定义 #define PI 3.1415926 2)无参宏调用:在程序里,用到字 main() 符序列的地方改用标识符 { int r=3;double s,d; d=2*PI*r; /*圆周长*/ 3)无参宏展开:系统自动将宏名替 S=PI*r*r; /*面积*/ 换为字符序列 d=2*3.1415926*r s=3.1415926*r*r; }
预处理进行宏定义时,可以引用已定义的宏名,可以层层替换举例: #define R 3 #define PI 3.1415926 #define D 2*PI*R main() { printf(“%f”,D); }
D2*PI*R 2*3.1415926*3
预处理1)带参宏定义: 多个参数由逗号分隔
格式:#define
标识符(形参列表) 字符序列隔开用空格
隔开用空格
2)带参宏定义的调用: 标识符(实参列表); /*实参可以是数值和表达式*/
3)带参宏定义的展开(系统如何理解带参的宏调用?):宏调用置换为字符序列.将字符序列中,所有形参符号(a,b)用 实参符号(3,4)来置换,替换的过程是简单的符号置换
#define max(a,b) (a>b)?a:bmax(3,4) max(3,4) 展开为 3>4?3:4 结果:4
举例: #define max(a,b) (a>b)?a:b main() { int a=3,b=4,m; m=max(3,4); printf(“%d”,m); }
预处理 带参宏:
#define V(s1,s2) s1=i*w;s2=i*h main() { int i=3,w=4,h=5,a,b; V(a,b); printf(“a=%d,b=%d”,a,b); }V(a,b)置换为s1=i*w;s2=i*h
遇到宏调用,将宏调用置换为字符序列. 将字符序列中,所有形参符号用 实参符号来置换,替换的过程是 简单的符号置换
形参符号: (s1,s2) 实参符号: (a,b)
将s1=i*w;s2=i*h中,所有的s1替换为a,s2替换为b,其余不变 a=i*w;b=i*h;
a=12,b=15;
预处理 带参宏:
将字符序列中,所有形参符号替换为对应实参符号
#define S(x) x*x main() { int m; m=S(3); m=S(3+1); } 3*3(3+1)*(3+1)? 结果:3+1*3+1 7 注意:替换的过程是简单的字符 置换,不做语法检查
所以,宏定义中加上括号,提高程序安全性
举例: #define S (x) (x)*(x) main() { m=S(3); m=S(3+1); }
16
预处理 带参宏定义:
#define S (x) x*x main() { int m; m=S(3); }
注意,在宏名和参数间没有空格
出错
注意:s与(x)多一个空格,S变为一个无参宏,而宏调用出错
正在阅读:
自考计算机基础与程序设计1107-22
吉林省2015年第一季新大纲会计从业资格无纸化考试《会计基础》模拟冲刺卷,答案及解析(5)05-08
第三章药品零售的质量管理08-07
这个故事让我懂得了感恩作文600字06-12
证件翻译模板01-10
开展技术培训加水产养殖业发展06-06
基本能力解析 - 图文06-28
梦中世界作文600字07-04
山东野鸡大学有哪些?02-15
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 程序设计
- 自考
- 计算机
- 基础