自考计算机基础与程序设计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变为一个无参宏,而宏调用出错

本文来源:https://www.bwwdw.com/article/wrcm.html

Top