C语言程序设计第9章(预处理命令)
c语言程序设计课程教学大纲(计算机科学与技术)
甘肃民族师范学院计算机专业课程教学大纲C语言程序设计一、说明(一)课程性质必修课(二)教学目的本课程是为计算机类等本、专科学生开设的,以培养学生程序设计能力为目的的专业基础课,是学习其他专业课的基础,同时也是第一门高级语言程序设计课。
本课程的任务是结合一般数值计算向学生介绍计算机程序设计的基本知识,使学生掌握C语言的基本语法,掌握程序设计的基本思想、基本概念和基本方法和技巧,并能运用所学的知识和技能对一般问题进行分析和程序设计,编制出高效的C 语言应用程序;同时了解进行科学计算的一般思路,培养应用计算机解决和处理实际问题的思维方法与基本能力,为进一步学习和应用计算机打下基础。
(三)教学内容计算机程序语言发展史,结构化程序设计的三种基本结构,函数,数组,指针,文件。
(四)教学时数90学时,60理论,30上机(五)教学方式多媒体授课二、本文第一章C语言程序设计基础教学要点:C程序的基本结构。
上机环境,进行简单C程序的编写。
教学时数:4学时(理论3学时,上机1学时)教学内容:第一节概述程序设计语言的发展。
C程序的基本结构。
第二节开发环境上机环境,进行简单C程序的编写。
考核要求:1.掌握编写C语言程序的基本步骤。
2. 掌握上机调试过程。
第二章数据类型、运算符与表达式教学要点:数据类型。
表达式。
输入输出函数。
教学时数:12学时(理论8学时,上机4学时)教学内容:第一节数据类型整型、实型、字符型、枚举型、构造类型、指针。
第二节常量与变量第三节运算符与表达式算术运算符及表达式、关系运算符及表达式、逻辑运算符及表达式、逗号运算符及表达式、条件运算符及表达式、赋值运算符及表达式。
第四节标准输入/输出scanf()函数、printf()函数。
第五节数学函数数学库头文件<math.h>。
第六节随机数发生器函数rand()和srand()函数,对应的头文件“stdlib.h”。
考核要求:1.理解数据结构、常量、变量的概念;2.掌握各种运算符的优先级及结合方向;3.熟练掌握数据的输入、输出方法;4.了解其他数学函数及随机函数的使用方法。
C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。
可见预处理过程先于编译器对源代码进行处理。
在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。
要完成这些工作,就需要使用预处理程序。
尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。
预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。
预处理过程还会删除程序中的注释和多余的空白字符。
预处理指令是以#号开头的代码行。
#号必须是该行除了任何空白字符外的第一个字符。
#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
下面是部分预处理指令:指令用途#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息一、文件包含#include预处理指令的作用是在指令处展开被包含的文件。
包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。
标准C编译器至少支持八重嵌套包含。
预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。
这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。
例如:#defineAAA#include"t.c"#undefAAA#include"t.c"为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。
c语言的预处理指令分3种 1宏定义 2条件编译 3文件包含
c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。
⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。
3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。
只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。
如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。
c语言程序设计基础教程课后答案
c语言程序设计基础教程课后答案C语言程序设计基础教程课后答案第一章:C语言概述1. 简述C语言的特点。
- C语言是一种结构化编程语言,具有高效、灵活、功能强大等特点。
- 它支持多种编程范式,如过程式编程、结构化编程、面向对象编程等。
- C语言具有较低的抽象级别,接近硬件,因此执行效率较高。
2. C语言的发展历史。
- C语言在1972年由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发。
- 它最初是作为UNIX操作系统的系统编程语言而设计的。
第二章:C语言环境和基本语法1. 如何设置C语言的开发环境?- 选择一个C语言编译器,如GCC、MSVC等。
- 安装编译器并配置环境变量,以便在命令行中直接调用编译器。
2. C语言的基本语法结构是什么?- C语言的基本结构包括预处理指令、函数定义、变量声明和语句。
第三章:数据类型、运算符和表达式1. C语言中的基本数据类型有哪些?- 整型(int)、字符型(char)、浮点型(float和double)等。
2. 运算符的分类及其用法。
- 算术运算符:+、-、*、/、%等。
- 赋值运算符:=、+=、-=等。
- 比较运算符:==、!=、>、<等。
- 逻辑运算符:&&、||、!等。
第四章:控制语句1. 条件语句的用法。
- if语句用于基于条件执行代码块。
- switch语句用于多条件选择。
2. 循环语句的用法。
- while循环用于在满足条件时重复执行代码块。
- for循环用于已知迭代次数的循环。
- do-while循环先执行代码块再判断条件。
第五章:数组和字符串1. 数组的基本概念和使用。
- 数组是相同数据类型的元素集合,存储在连续的内存位置。
- 声明数组:int arr[10]; 表示一个包含10个整数的数组。
2. 字符串的表示和操作。
- 在C语言中,字符串是以空字符('\0')结尾的字符数组。
- 使用标准库函数如strcpy、strlen等操作字符串。
C语言程序设计教程CJ_04预处理命令_潭浩强第3版
Page 6
辽宁师范大学
蔡静
带参宏替换 函数调用 编译时替换, 运行时调用, 编译时替换 不占用内存 运行时调用 占用内存 只替换不计算 计算 替换使程序代码加长 不加长 存在数据类型问题 不存在数据类型问题
Page 7
辽宁师范大学
蔡静
9.2 “文件包含 处理 文件包含”处理 文件包含
通过预处理命令#include把另一个文件的全部内容包含到本 文件中。 格式1: #include <文件名 文件名> 文件名 只按系统指定的标准方式(从编译系统所在子目录中)检索 文件目录。 格式 2: #include “文件名” 文件名” 文件名 系统首先在当前源文件所在目录中寻找该文件,若找不到, 再按系统指定的标准方式检索其他文件目录。 例:9.6
Page 9
辽宁师范大学
蔡静
Thanks
Page 8
辽宁师范大学
蔡静
9.3 条件编译
指定满足某条件才能对指定语句进行编译,称为条件编译。 几种形式: 程序段2】 程序段 】 #endif
#ifndef 标识符 程序段1 程序段 【#else 程序段2】 程序段 】 #endif
#if 表达式 程序段1 程序段 【#else 程序段2】 程序段 】 #endif
Page 5
辽宁师范大学
蔡静
二、带参数的宏替换/宏定义 带参数的宏替换 宏定义
格式: #define 宏名 形参表 宏名(形参表 形参表) 例:#define S(M, N) M*N
字符串
说明: 带参数的宏定义不是进行简单字符串替换,还要进行参数 替换。形参表列中的参数出现在字符串中。 宏展开只是将程序语句中宏名后括号内的实参代替 #define命令中的形参,并不计算。 宏名与其后括号间不能有空格。 例9.3-9.5:
预处理命令
二、表演区 (一)什么是表演区 表演区以幼儿表演游戏为设计核心,通过道具吸引幼儿积极参加故事表 演、游戏等活动。 (二)表演区的环境布置与材料投放 表演区可以分为固定式和活动式表演区角两类。 固定式的表演区角是指在活动室内辟出一定区域,存放表演所需要的用 具。 活动式的表演区角则是根据表演需要,临时在走廊、门厅、过道或室外 等地方设置表演场所,便于及时放置和收拢。
第9章 预处理命令
• 9. 1 概述 • 9. 2 宏定义 • 9. 3 文件包含 • 9. 4 条件编译
9. 2 宏定义
• 9. 2. 1 无参宏定义
• 无参宏的宏名后不带参数。 • 其定义的一般形式为 • #define 标识符字符串 • 其中, #表示这是一条预处理命令; 凡是以#开头的指令均为预处理命
果果:“老师,一分钟是多久呢?” 教师:“就是一会儿,我一转身。” 贝贝:“我知道,最细的秒针走一圈,挺长的。” 佳佳:“一分钟就是我们从门口走到后面的窗子那里。” 教师:“一分钟能做什么?” 佳佳:“给花浇水。” 果果:“唱完一首歌。” 贝贝:“搬来一把椅子。”……
学习目标
1. 了解幼儿日常交谈的主要特点及指导要求。 2. 掌握语言区角的环境布置与材料投放要求,能科学地开展语言区角活 动的指导。 3. 学会设计听说游戏的玩法,并能评析幼儿园听说游戏。
上一页 下一页 返回
9. 2 宏定义
• 【例9 - 2】不作宏代换程序举例。
上一页 下一页 说明: • 虽然已定义宏名OK 表示100, 但在printf 语句中OK 被引号括起来, 因
此不作宏代换。 • 程序的运行结果为“OK”, 这表示把“OK” 当字符串处理。
上一页 下一页 返回
义时, 必须十分注意, 应保证在宏代换之后不发生错误。
C语言程序设计教程(电子教案)
学习目标
对C语言有一个概括的了解, 能够编写包含键盘输入、计算和 显示输出等操作的简单C程序。
4
主要内容
• C语言的产生与特点 • 简单C程序的组成 • C语言应用程序开发的基本步骤
5
1.1 C语言的产生及特点
C语言是为了编写系统程序而在1968年开始 研发的计算机高级语言
C语言表达能力强,使用灵活,程序结构清 晰,紧凑,可移植性好
指针 类型
17
基本数据类型说明符
整型:int long
字符型:char 实型:float
double long double
18
2.2 常 量
常量∶在程序运行过程中,其值不能被改 变的量。
一. 不同数制整型常量的表示
例如: 12 :十进制数 12
012 :八进制数 12(等于十进 制数10,用前导符0表示八进制数常量)
计算x+y+z,并将结 8果赋给变量sum
显示变量 sum的值
主函数 main()
一般C程序的组成
【例1-2】采用模块结构,改写例1-1的程序。 add(int x,int y,int z )
{ return(x+y+z);
}
函数add()
调用函数 add()
main() { int x,y,z; printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z);
4. 用‘\’ ’表示字符’ ,‘\”’表示字符”, ‘\\ ’表示字符\ 。
5. 用双引号括起来的字符序列表示字符串常量,其 中最后一个字符是字符串结束符‘\0’,不显式 地表示出来。如:“English” 。
浙江农林大学C语言程序设计习题集答案
第1~3章C语言概述、算法、数据类型、运算符与表达式一、选择题ACDCB CCDCB D二、填空题1、n=202、a=66,b=E第4章顺序程序设计一、选择题BAAD二、程序阅读1、12 240 122、2,3,2,23、0三、编程1#include <stdio.h>#include <math.h>void main(){float a,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c);s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("a=%f,b=%f,c=%f,area=%f",a,b,c,area);}2#include <stdio.h>#include <math.h>void main(){float a,b,c,del,x1,x2;scanf("%f,%f,%f",&a,&b,&c);del=b*b-4*a*c;if (del>=0){x1=(-b+sqrt(del))/(2*a);x2=(-b-sqrt(del))/(2*a);printf("x1=%f,x2=%f",x1,x2);}elseprintf("没有实根");}3#include <stdio.h>void main(){int c,f;c=26;f=9.0/5.0*c+32;printf("%d的华氏温度是%d",c,f);}第5章选择结构程序设计一、选择题DBBCDC二、程序阅读1、|a|+|b|=612、PQ3、-14、60~9060error!5、0,16、x+y+z=15三、编程1#include <stdio.h>void main(){int a,b,c,min;scanf("%d,%d,%d",&a,&b,&c);min=a;if (min>b) min=b;if (min>c) min=c;}2#include <stdio.h>void main(){int a;scanf("%d",&a);if(a%3==0 && a%5==0 && a%7==0)printf("yes");elseprintf("no");}3#include <stdio.h>#include <math.h>void main(){float x,y;scanf("%f",&x);if (x<0)y=fabs(x);else if(x>=0 && x<=2)y=sqrt(x+1);else if (x>=2 && x<4)y=pow(x+2,3);elsey=2*x+5;printf("x=%f,y=%f",x,y);}4#include <stdio.h>void main(){float rate,tax,salary;scanf("%f",salary);if(salary<=850)rate=0;else if(salary>1350 && salary<=2850)rate=0.1;else if(salary>2850 && salary<5850)rate=0.15;elserate=0.2;tax=rate*(salary-850);printf("salary=%f,rate=%f,tax=%f",salary,rate,tax);}5#include <stdio.h>void main(){int a,b,sum,n;scanf("%d,%d",a,b);sum=a*a+b*b;if(sum>100){n=sum/100;printf("a*a+b*b=%d,n=%d",sum,n);}elseprintf("a*a+b*b=%d",sum);}第6章循环控制一、填空题:1、222、233、464、117二、选择题:1.C2.D3.B4.B5.B6.C7.C8.C9.B 10.D三、程序阅读:1、输出:332、输出:243、2#4#7#11#16#4、3#2#0#0#1#5、B,A,D,C6、D,A,B,C7、B,C,A,D8、A,D,D,C9、C,C,A10、B,D,A11、A,D,C四、编程1.#include <stdio.h>#include <math.h>void main(){ int x;printf("x sqrt(x)\n");for(x=5;x<=1000;x++)printf("%d %f\n", x, sqrt(x));}2.#include<stdio.h>#include<math.h>main(){int i,flag;double pi,item;i=1;flag=1;pi=0;item=1.0;while(fabs(item)>=0.00001){ item=flag*1.0/i;pi=pi+item;flag=-flag;i=i+2;}pi=pi*4;printf("pi=%f",pi);}3.教材126页例6.84.#include<stdio.h>main(){ int i,num1,num2,num3;num1=1;num2=1;printf("%d %d ",num1,num2);for(i=3;i<=10;i=i+1){num3=num1+num2;printf("%d ",num3);num1=num2;num2=num3;}}第7章数组一、选择题:1. D2.D3.A4.C5.C6.C7.D8.B9.D 10.B 11.D 12.D13.D 14.A 15.B二、程序阅读:1、A,B,B,D2、C,D,A,B4、D,C,A5、C,D6、C,A7、1#2#3#1#1#38、298三、编程:1、#include <stdio.h>void main( ){int mark, a, p, f;a = p = f = 0;printf("Enter scores:");scanf ("%d", &mark);while (mark >0){if(mark >= 85) a++;else if (mark >= 60) p++;else f++;scanf ("%d", &mark);}printf(">=85:%d\n", a);printf("60-84:%d\n", p);printf("<60:%d\n", f);}2、#include <stdio.h>void main( ){ int a[10],count=0,i;float average,sum=0;for(i=0;i<10;i++){ scanf("%d",&a[i]);sum=sum+a[i];}average=sum/10;for(i=0;i<10;i++)if(a[i]>average) count=count+1;printf("平均值为%f 大于平均值的数有%d个",average,count); }3.#include<stdio.h>main( ){ int a[10];printf(“请输入一个正整数n(1<n≤10):”);scanf(“%d”,&n);printf(“请输入数据:”);for (i=0; i<n; i++)scanf("%d",&a[i]);printf("\n");for (j=0; j<n-1; j++) /*确定基准位置*/for(i=j+1; i<n; i++)if (a[j]>a[i]){ t=a[j];a[j]=a[i];a[i]=t; }printf("The sorted numbers: \n");for (i=0; i<n; i++)printf("%d",a[i]);}4.#include <stdio.h>void main(){int a[6][6],n,i,j,x,y,max;printf(“请输入一个正整数n(1≤n≤6):”);scanf(“%d”,&n);printf(“请输入一个n行n列的矩阵:\n”);for (i=0;i<n;i++)for (j=0;j<n;j++)scanf(“%d”,&a[i][j]);max=a[0][0]; x=0;y=0;for (i=0;i<n;i++)for (j=0;j<n;j++)if (fabs(a[i][j])>max) {max=a[i][j];x=i;y=j;}printf(“绝对值最大的元素为:%d,下标分别为:%d,%d\n”,max,x,y); }第8章函数一、选择题(1) A(2) B(3) C(4) B(5) A(6) C(7)i. Bii. Diii. A真诚为您提供优质参考资料,若有不当之处,请指正。
C语言程序设计 第3版 第9章 编译预处理
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
第9章C语言
9.2.1 文件的打开
在C语言中,打开文件是由fopen()函数实现的,函数原型 如下: FILE *fopen( char *filename, char *mode ) 其中,filename和mode分别是所要打开文件的文件名和将要 对其操作的模式;函数的返回值是一个文件类型指针,指向 被打开文件的文件缓冲区(结构体变量)的起始地址。如果 文件打开失败,则函数返回值是一个NULL指针。 为了对已打开的文件进行操作,应该立即把fopen()函数 的返回值赋给一个文件类型指针变量,若没有立即把返回值 赋给一个文件类型指针,而进行其它操作,可能导致此函数 的返回值丢失,而无法对所打开的文件进行操作。 如果需要对磁盘文件file1.txt,进行读写操作,可用如下 方式打开这个文件:
9.3.1 输入和输出一个字符
(a)命令窗口中输入的命令 (b)读出的文件中的内容 图9-3 例9.1的执行结果
9.3.1 输入和输出一个字符
其中,“C Language!”是文件file1.txt中的内容。 需要注意的是,该程序是将打开文件中的字符,逐一 的取出并显示出来。直到遇到文件的结束标志,结束 读出操作。 可以通过该程序打开任意的文本文件,只要把所要打 开的文件名作为命令的参数即可。
9.1 文件概述
9.1.1 文件的基本概念 9.1.2 缓冲文件系统和非缓冲文件系统 9.1.3 文件类型指针
9.1.1 文件的基本概念
所谓文件是指记录在外部介质上的数据的集合。数据是 以文件的形式存放在外部介质上的。操作系统都是以文 件为单位对数据进行管理的,如果系统要从外部存储设 备上寻找需要的数据,系统首先找到该部分数据属于的 文件,根据文件名找到所指定的文件,然后从文件中读 出数据。如果要向外部存储设备上存储数据,也需要把 待存储的数据建立成文件,再以文件的形式向外输出。
第9章预处理定义
C语言程序设计(第三版) My email:chenguot@
area=S(a); printf(“r=%f\narea=%f\n”,a,area);
area=3.1415926*a*a;
}
C语言程序设计(第三版) My email:chenguot@
10
§9.1 宏定义(7)
如下宏定义:
说明:
#define S (r) PI*r*r
⑴对带参数的宏的展开只是将语对句于中语的句宏名后面括号内的实
file1.c 或
file2.c
#include<file2.c>
#include <文件名> B
A
file1.c
A B
C语言程序设计(第三版) My email:chenguot@
16
§将包9.宏含2代到表用“文输户出程件格序包式中做:含出”头文处件理,并(2) (2)主文件file1.c
(好1处):将“格文式件宏包做含成”头命文令件可fo以rm节at.省h 程序设计void人m员ain的() 重复劳动。
#如inc:lud某e <单std位io.的h>人员往往使用一组固定的符号{ 常量(g=9.81,
#pdie=fi3n.e1P4R15p9ri2nt6f,e=2.718,c=…),可以把这些宏int定a,b义,c,d命; 令组成 ##一量定ddeeff个包义iinnee头含这ND文到些L“%“件自符\dn””,己号然所常后写量各的,人源相都文当可件于以中工用。业这上#in样的cl每标ud个准e命人零令cah=就件a1将r;b可,s=t这r2i以拿n;cg些=[不来]3=;符d“必就C=4号H;重用IN常A复。”;
第9章C语言程序设计
9.1位运算符
例9.2 按位或程序举例 main() { int a=9,b=5,c; c=a|b; printf("a=%d\nb=%d\nc=%d\n",a,b,c); } 运行结果:
9.1位运算符
9.1.3 按位异或运算
按位异或运算符“^”是双目运算符。其功能是参与运算的两数 各对应的二进位相异或,当两对应的二进位相异时,结果为1。参 与运算数仍以补码出现,例如9^5可写成算式如下: 00001001 ^00000101 00001100 (十进制为12) 9^5结果为12。按位异或通常用来: (1)与0异或,可以保留原值不变。如10^0 00001010 ^ 00000000 00001010
00001001 &00000101 00000001
按位与运算通常用来对某些位清0或保留某些位。例如即想让 某一个字节或多个字节中的位为0。例如:00001001(十进制9) 只要找到这样的数00000110、11110110、00000000等都可以, 即只要和要清零数中每一个二进制位相反即可,或者某一位二进制 位为0和0与结果也是0。
9.1位运算符
9.1.4求反运算
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算 的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110。
9.1位运算符
9.1.5 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算 数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数, 高位丢弃,低位补0。例如: a<<2 指把a的各二进位向左移动2位。 如a=2,十进制00000010,左移2位后为00001000 (十进制8)。 高位左移,低位补0。并且左移一位相当于乘以2的运算,左移两位 相当于乘以4即22。 例9.4 左移程序举例 main() { int a=2; a=a<<2; printf(“a=%d\n”,a); } 运算结果:
谭浩强C程序设计(第三版)清华课件第9章_预处理
•
16、提出一个问题往往比解决一个更 重要。 因为解 决问题 也许仅 是一个 数学上 或实验 上的技 能而已 ,而提 出新的 问题, 却需要 有创造 性的想 像力, 而且标 志着科 学的真 正进步 。2021/6/29202 1/6/29J une
•
17、儿童是中心,教育的措施便围绕 他们而 组织起 来。202 1/6/292 021/6/2 92021/6/29202 1/6/29
printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); }
8
运行情况如下:
input radius: 4↙
说明:
1=25.1328 s=50.2655 v=150.7966
(1) 宏名Biblioteka 般习惯用大写字母表示,以便与变量名相 区别。但这并非规定,也可用小写字母。
• 经过预处理后程序可由编译程序对预处理后的 源程序进行通常的编译处理,得到可供执行的 目标代码。
4
基本概念
• C语言与其他高级语言的一个重要区别是可以 使用预处理命令和具有预处理的功能。
C提供的预处理功能主要有以下三种:
1.宏定义
2.文件包含
3.条件编译
这些功能分别用宏定义命令、文件包含命令 、条件编译命令来实现。为了与一般C语句相 区别,这些命令以符号“#”开头。例如: #define #include
• 这个标识符(名字)称为“宏名”。
• 在预编译时将宏名替换成字符串的过程称为“宏展 开”。#define是宏定义命令。
6
•
9、要学生做的事,教职员躬亲共做; 要学生 学的知 识,教 职员躬 亲共学 ;要学 生守的 规则, 教职员 躬亲共 守。20 21/6/29 2021/6/29Tues day , June 29, 2021
51单片机C语言应用与开发(第9章)
4. 具有将可变的选择与特殊操作组合在一起的 能力,改善了程序的可读性;
5. 提供的库包含许多标准子程序,具有较强的 数据处理能力; 6. 由于具有方便的模块化编程技术,使已编好 程序可容易地移植;
C51程序结构
预处理命令 全局变量说明; 函数1说明; …… …… 函数n说明;
main() { 局部变量说明; 执行语句; 函数调用(实际参数表); 函数1(形式参数说明) { 局部变量说明; 执行语句; 函数调用(实际参数表); } …… …… 函数n(形式参数说明) { 局部变量说明; 执行语句; 函数调用(实际参数表); }
8
片内RAM,间接寻址,共256字节。
片外RAM,分页间址,共256字节。(MOVX @Ri)
xdata
code
16
16
片外RAM,间接寻址,共64k字节。(MOVX @DPTR)
ROM区域,间接寻址,共64k字节。(MOVC @DPTR)
访问片内RAM比访问片外RAM的速度要快得 多,所以对于经常使用的变量应该置于片内 RAM中,即用bdata、data、idata来定义;对 于不经常使用的变量或规模较大的变量应该置于 片外RAM中,即用pdata、xdata来定义。例如:
/* IP */ sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */ sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0; /* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98; #endif
C语言 选择题库第9章 编译预处理和动态存储分配
第9章编译预处理和动态存储分配1.以下叙述中正确的是()。
A) 在C语言中,预处理命令行都以"#"开头B) 预处理命令行必须位于C源程序的起始位置C) #include <stdio.h>必须放在C程序的开头D) C语言的预处理不能实现宏定义和条件编译的功能参考答案:A【解析】预处理命令是以"#"号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以B),C)错误。
C)语言的预处理能够实现宏定义和条件编译等功能,所以D)错误。
2.以下关于宏的叙述中正确的是()。
A) 宏替换没有数据类型限制B) 宏定义必须位于源程序中所有语句之前C) 宏名必须用大写字母表示D) 宏调用比函数调用耗费时间参考答案:A【解析】宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头,所以B)选项中宏定义必须位于源程序中所有语句之前是错误的。
宏名一般用大写,但不是必须用大写,所以C)选项错误。
宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值),所以D)选项错误。
3.有以下程序:#include <stdio.h>#define PT 3.5 ;#define S(x) PT*x*x ;main(){int a=1,b=2;printf("%4.1f\n" ,S(a+b));}程序运行后的输出结果是()。
A) 7.5 B) 31.5 C) 程序有错无输出结果D) 14.0参考答案:C【解析】宏定义不是C语句,末尾不需要有分号。
所以语句printf("%4.1f\n" ,S(a+b));展开后为printf("%4.1f\n" ,3.5;*a+b*a+b;);所以程序会出现语法错误。
C语言程序设计 16-枚举、预处理等汇总
24
带参的宏定义使用举例
#define S(x,y) x*y main() { int a=3,b=4,c=5,d=6;
printf("a*b=%d\n", S (aa*b, b ) ) ; printf("a+b*c+d=%d\n" , S(a((+ab+)b*()c,(+cd+)d))));; }
enum weekday day; (2) enum weekday {Sun,Mon,Tue} day; (3) enum {Sun,Mon,Tue} day;
12
三、枚举型变量的使用
1)可对枚举变量赋值,但只能把枚举元素名赋给 枚举变量,不能把枚举元素值直接赋给枚举变量。 如: enum weekday {Sun,Mon, Tue, Wed, Thu,
10
一、枚举类型的定义
• 枚举元素的值也可在定义时重指定。例如: enum weekday {Sun=7,Mon=1, Tue, Wed, Thu,
Fri, Sat} ; 对于没有指定值的元素,按顺序加1,故: Tue是2,Wed是3,…,Sat是6。
11
二、枚举型变量的定义 枚举型变量的定义也有三种方式,如: (1) enum weekday { Sun,Mon,Tue };
3)可用枚举变量进行判断或比较操作。 enum flag {true,false} my_flag; … if (my_flag == true)
二级c语言第九章预处理命令
如果在程序中有下面的语句: R1=Radium(100); 那么,在编译预处理时,宏展开的顺序为从左到右进行置换,如果字符串 中包含宏中的形参,则将其用程序语句中相应的实参来替代,而字符串中的 其它字符原样保留。 因此,在处理上述语句时,将用 sqrt(area/PI) 替代 Radium(100),同时将 字符串sqrt(area/PI)中的形参area用实参l00来替代,并把已定义的宏PI的值代 入,经宏展开后,该语句变为“ R1=sqrt(100/3.14159); ”。
内蒙古科技大学 工程训练中心
预处理命令概述
所谓预处理,就是指源程序被正式编译之前所进行的处理工作,这 是C语言和其他高级语言之间的一个重要区别。
所有的预处理指令均以“#”开头,在它前面不能出现空格以外的字 符,而且在行结尾处没有分号。 “预处理命令” 的作用不是实现程序的功能,它们是发布给编译系 统的信息。它们告诉编译系统,在对源程序进行编译之前应该做些什么, 所以称这类语句为编译预处理命令。 C语言在执行一个C程序时,如果程序中有预处理命令,则首先进行 编译预处理(即根据预处理命令对源程序进行预先处理),然后再将经过 预处理的源程序编译成目标文件,而后进行目标文件的连接,当这些工 作都顺利通过后,才最终执行目标代码。这种执行过程大大提高了编程 效率。
PI 的有效范围
因为#undef 的作用是终止宏定义,因此PI的作用域从它定义开始到 #undef结束。在这以后,如果程序中出现 PI,则它不代表3.14159 。使 用#undef可以灵活控制宏定义的作用范围。
2019年1月8日5时29分 工程训练中心 徐国海
(二)带参数宏定义 (了解) 定义的一般格式为: #define 宏名(形式参数列表) 字符串
C语言9
第 九 章 编 译 预 处 理
7-1
宏定义 不带参数的宏定义 带参数的宏定义
7-1-1 7-1-2
7-2
7-3
文件包含
条件编译
9-1
宏定义
例9-1 请看下面的程序: #define PI 3.14159 main() {float r,l,s; scanf("%f",&r); l=2*PI*r; s=PI*r*r; printf("l=%7.2f,s=%7.2f\n",l,s); } 程序的第一行内容:#define PI 3.14159 就是一个宏定义,PI 称为宏名,其作用是用标识符PI代表3.14159这样一串字符。在此之后 的程序中就可以用标识符PI代替3.14159,称为宏引用。 预处理时,程序中的PI 将被所定义的串3.14159替换,称为宏展开 或宏替换,如程序中的语句:l=2*PI*r;和s=PI*r*r;中的宏展开后分别 为:l=2*3.14159*r;和s=3.14159*r*r;。 有两种形式的宏 :不带参数的宏和带参数的宏。
9-2
文件包含(1)
一个C 程序由若干个源程序组成,而一个源文件还可以将另一个源 文件的全部内容包含进来,即将指定源文件的内容包含在当前文件中。 例如有两个源文件file1.c和file2.c,文件的内容分别如下: file1.c的内容: int max(int x,int y) {int z; if(x>y) z=x; else z=y; return z; } file2.c的内容: #include "file1.c" main() {int a,b,c; scan("%d,%d",&a,&b); c=max(a,b); printf("c=%d\n",c); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)一个include命令只能指定一个被包含文件,如果要 包含n个文件,要用n个include命令;
(2)如果file1.c文件包含file2.h文件,而文件file2.h要用 到file3.h的内容,则可在file1.c用两个include命令分别包 含文件file2.h和file3.h,而且file3.h应出现在file2.h之前。 即:
例9.1
#define PI 3.1415926 main( ) {
float l,s,r,v; printf("input radius:"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); }
• 宏替换不占运行时间只占编译时间。而函数调用则占 运行时间(分配单元、保现场、值传递、返回)。
9.2 “文件包含”处理
所谓“文件包含”处理是指一个源文件可以将另外 一个源文件的全部内容包含进来, 即将另外的文件包含 到本文件之中。C语言提供了#inc1ude命令用来实现“文 件包含”的 操作。其一般形式为
4)宏定义不是C语句,不必在行末加分号,如果
加了分号,则会连同分号以其进行替换; 如: #define PI 3.1415926; area = P*r*r; 在宏扩展后成为: area = 3.1415926;*r*r; 结果,在编译时出现语法错误。
5)宏名的有效范围为定义命令之后到本 源文件 结束。通常,#define命令写在文件开头,函数之前,作
第九章 预处理命令
编译预处理:在源程序文件中,加入“编译预处理命 令”,使编译程序在对源程序进行通常的编译(包括词 法分析、语法分析、代码生成、代码优化)之前,先对 这些命令进行预处理,然后将预处理的结果和源程序一 起再进行通常的编译处理,以得到目标代码(OBJ文件)。
C提供的编译预处理命令
宏命令(Macro)
为文件一部分,在此文件范围内有效。
6)可以用#undef命令终止宏定义的作用域。这样可以
灵活控制宏定义的作用范围。
7)在进行宏定义时,可以引用已定义的宏名,可以层层置 换。
例9.2 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main( ) {
说明:
1)宏名一般习惯用大写字母表示。非强制
规定,也可用小写字母;
2)使用宏定义,可以提高程序的通用性,能作 到“一改俱改”;
3)宏定义只作简单的替换,不作正确性检查。 如果词义或语义错误,只有在编译已被宏展开后 的源程序时才会发现错误井报错。例如:
#define PI 3.14l59 把第二个“1”写成“l”。这样的错误只有在 编译已被宏展开后的源程序时才会发现错误井报 错;
(3)对函数中的实参和形参都要定义类型,二者的类 型要求一致。不一致,应进行类型转换。而宏不存在 类型问题,宏名无类型,它的参数也无类型,只是一 个符号代表。
• 调用函数只可得到一个返回值,而用宏 可以设法得到几个结果。
• 使用宏次数多时,宏展开后源程序长,因为每展开一 次都使程序增长,而函数调 用不使源程序变长。
#inc1ude“文件名”
或
#include<文件名>
file1.c
file2.c
#includeB<file2.c>
B
A
这种常用在文件头部的被包含的文件称为“标题文件” 或“头部文件”,常以“h”为后缀(h为head(头)的 缩写),如“stdio.h”文件。当然不用“h”为后缀,而用 “c”为后缀或者没有后缀也是可以的,但用”h”作后缀 更能表示此文件的性质。
说明: (1)用宏名后面括号内的实参字符串原样代替#define 命令行中的形参。
如果有以下语句: area=S( a+b )
S( r )
PI *r * r
注意计算次序
area=PI*a+b*a+b
应当在定义时形式参数外面加一个括弧。
#define S(r) PI*(r)*(r)
(2)在宏定义时,在宏名与带参数的括弧之 间不应加空格,否则将空格以后的字符都作
例如
#define S(a,b) a*b
arear=S(2,3);
其中S(2,3)相当与2*3. 置换方式
从左到右进行置换。 形参用相应的实参(可以是常量、变量或表达式) 代替,不是参数字符,则保留。
Hale Waihona Puke 例9.3 #define PI 3.1415926 #define S(r) PI*r*r main( ) { float a,area; a=3.6; area=S(a); printf(“r=%f\narea=%f\n”,a,area); }
printf(“L=%f\nS=%f\n”,L,S); }
8)对程序中用双括号括起来的字符串内的字符,即使
与宏名相同,也不进行置换;
9)宏定义是专门用于预处理命令的一个专用名词,它与定
字符 义变量的含义不同,只作
替换,不分配内存空间;
9.1.2带参数的宏定义
一般形式 #define 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数。
为替代字符串的一部分,
参数的宏和函数的比较:
• 类似之处:在引用函数时也是在函数名后的括弧内写 实参,也要求实参与形参的数目相等,
• 带参的宏定义与函数的区别:
(1)函数调用时,先求出实参表达式的值,然后代入 形参。而使用带参的宏只是进行i简单的字符替换;
(2)函数调用是在程序运行时处理的,分配内存单元。 而宏展开是在编译时进行的,在展开时并不分配内存 单元,不进行值的传递处理,也没有“返回值”的概 念;
文件包含命令(include)
条件编译命令
这些命令均以#开头,以区别于语句。
9.1 宏定义
9.1.1不带参数的宏定义 一般形式:
#define 标识符 字符串 例:
#define PI 3.1415926 作用:
用标识符(称为“宏名” )PI来代替3.1415926这个字 符串,在编译预处理时,将程序中在该命令以后出现的所 有的PI都用3.1415926代替(这一过程又称为“宏展开”)。