第二章_C++对C的扩展
- 格式:pdf
- 大小:731.24 KB
- 文档页数:50
算法设计与分析C语⾔描述(陈慧南版)课后答案第⼀章15P1-3. 最⼤公约数为1。
快1414倍。
主要考虑循环次数,程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)若考虑其他语句,则没有这么多,可能就601倍。
第⼆章32P2-8.(1)画线语句的执⾏次数为log n 。
(log )n O 。
划线语句的执⾏次数应该理解为⼀格整体。
(2)画线语句的执⾏次数为111(1)(2)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执⾏次数为。
O 。
(4)当n 为奇数时画线语句的执⾏次数为(1)(3)4n n ++,当n 为偶数时画线语句的执⾏次数为 2(2)4n +。
2()n O 。
2-10.(1)当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()n n n -+=O 。
(2)当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()n n n -+=Ω。
(3)由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()n n n -+=Θ。
2-11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选 212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
注意:是f (n )和g (n )的关系。
GNU C 9条扩展语法GNC CC是一个功能非常强大的跨平台C编译器,它对标准C语言进行了一系列扩展,以增强标准C的功能,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。
本文把支持GNU扩展的C语言称为GNU C。
Linux内核代码使用了大量的GNU C扩展,以至于能够编译Linux内核的唯一编译器是GNU CC,以前甚至出现过编译Linux内核要使用特殊的GNU CC版本的情况。
本文是对Linux内核使用的GNU C扩展的一个汇总,希望当你读内核源码遇到不理解的语法和语义时,能从本文找到一个初步的解答,更详细的信息可以查看。
文中的例子取自Linux 2.4.18。
1、零长度和变量长度数组组长度为1,分配时计算对象大小比较复杂。
3、语句表达式GNU C把包含在括号中的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方,你可以在语句表达式中使用循环、局部变量等,原本只能在复合语句中使用。
例如:复合语句的最后一个语句应该是一个表达式,它的值将成为这个语句表达式的值。
这个定义计算x和y分别两次,当参数有副作用时,将产生不正确的结果,使用语句表达式只计算参数一次,避免了可能的错误。
语句表达式通常用于宏定义。
4、typeof 关键字使用前一节定义的宏需要知道参数的类型,利用typeof可以定义更通用的宏,不必事先这里typeof(x)表示x的值类型,第3行定义了一个与x 类型相同的局部变量_x 并初使化为x,注意第5行的作用是检查参数x和y的类型是否相同。
typeof 可以用在任何类型可以使用的地方,通常用于宏定义。
5、可变参数宏这里arg表示其余的参数,可以是零个或多个,这些参数以及参数之间的逗号构成arg 的值,在宏扩展时替换arg,例如:使用##的原因是处理arg不匹配任何参数的情况,这时arg的值为空,GNU C预处理器在这种特殊情况下,丢弃##之前的逗号,这样扩展为注意最后没有逗号。
一、选择题1.操作系统是现代计算机系统不可缺少的组成部分。
操作系统负责管理计算机的(C)A.程序B.功能C.资源D.进程2.操作系统的主体是( B)A.数据B.程序C.内存D.CPU3.下列操作系统中,属于分时系统的是(A)A.UNIXB.MS DOSC.Windows7D.Novell NetWare4.下列操作系统中,运行在苹果公司Macintosh系列计算机上的操作系统是(A)A.MS DOSB.UINXC.Novell NetwareD.Linux5.在搜索文件时,若用户输入“*”,则将搜索(C)A.所有含有“*”的文件B.所有扩展名中含有“*”的文件C.所有文件D.以上全不对6.下列操作系统中,不属于智能手机操作系统的是(C)A.AndroidB. iOSC. LinuxD. Windows Phone7.以下(A)文件被称为文本文件或ASCII文件。
A.以EXE为扩展名的文件B.以TXT为扩展名的文件C以COM为扩展名的文件 D.以DOC为扩展名的文件8.关于Windows直接删除文件而不进入回收站的操作中,正确的是(A)A.选定文件后,按“Shift”+“Del”键B.选定文件后,按“Ctrl”+“Del”键C.涉定文件后,按“DeI”键D.选定文件后,按“Shift”键,再按“Del”键9.下列关于进程的说法中,正确的是(C)A.进程就是程序B.正在CPU运行的进程处于就绪状态C.处于挂起状态的进程因发生某个事件后(需要的资源满足了)就转换为就绪状态D.进程是一个静态的概念,程序是一个动态的概念10.在Windows中,各应用程序之间的信息交换是通过(B)进行的。
A.记事本B.剪贴板C.画图D.写字板11.下列关于线程的说法中,错误的是(B)A.在Windows中,线程是CPU的分配单位B.有些进程包含多个进程C.有些进程只包含一个线看有D.把进程再”细分”成线程的目的是更好地实现并发处理和共享资源12.下列关于文件的说法中,正确的是(A)A.在文件系统的管理下,用户可以按照文件名访问文件B.文件的扩展名最多只能有3个字治C.Windows中,具有隐藏属性的文件一定是不可见的D.Windows中,具有只读属性的文件不可以删除13.下列关于设备管理的说法中,错误的是(A)A.所谓即插即用,就是指没有驱动程序仍然能使用设备的技术B.即插即用并不是说不需要安装设备驱动程序,而是意味着操作系统能自动检测到设备并自动安装驱动程序C.Windows中,对设备进行集中统一管理的是设备管理器D.所有的USB设备都支持即插即用和热插拔14.同时按(B)键可以打开任务管理器。
课程内容第一章C++语言概述第二章基本数据类型和表达式第三章C++程序的流程控制第四章数组第五章C++函数第六章指针、引用和动态空间管理第七章结构和联合第八章类与对象第九章C++流第一章C++语言概述1.1C++语言的简史1.1.1 C语言1972年贝尔实验室C语言特点➢优点:高效、灵活、功能丰富、表达力强、一致性好➢局限性:●类型检查机制相对较弱,程序中的错误不能再编译时发现;●不支持代码重用。
1.1.2 C++语言20世纪80年代贝尔实验室C++是C语言的扩充,主要的扩充功能:●支持数据抽象●支持面向对象的设计及编程●改进了C语言中的若干不足之处1.2简单C++程序例1#include<iostream.h> //预处理命令,头文件void main() //主函数{int a,b; //定义变量cout<<”Enter two integer.”; //在标准输出设备上输出cin>>a>>b; //从标准输入设备上输入int result;result<<”\n The sum of”<<a<<”+”<<b<<”=”<<result<<endl;}字母区分大小写1.2.1注释:/*传统的C语言注释方法,注释内容可以再多行。
*///C++新增的注释方法,注释内容从//开始,到行末结束。
1.2.2 包含文件及头文件将其他文件中的源程序插入当前文件的#include语句位置中。
被包含文件一般称为头文件。
头文件扩展名一般为.h。
#include<文件名>头文件在编译系统的INCLUDE目录中查找。
#include”文件名”头文件现在当先目录查找,而后再在编译系统的INCLUDE目录中查找。
1.2.3 标准输入与输出在iostream.h中定义有两个对象:标准输入对象cin,用于从标准输入设备读入数据(一般指键盘)。
第1章计算机组成原理考试大纲第一章计算机体系结构和计算机组成冯。
诺伊曼体系的特点Amdahl定律第二章数制和数制转换各种码制的表示和转换浮点数的表示补码加减法布思算法浮点数的加减法海明码的计算练习:5,6,7,8,101、已知X=19,Y=35,用布思算法计算X×Y和X×(-Y)。
2、使用IEEE 754标准格式表示下列浮点数:-5,-1.5,1/16,-6,384,-1/32。
3、已知X=-0.1000101×2-111,Y=0.0001010×2-100。
试计算X+Y,X-Y,X×Y和X/Y。
4、某浮点数字长12位,其中阶符1位,阶码数值3位,尾符1位,尾数数值7位,阶码和尾数均用补码表示。
它所能表示的最大正数是多少?最小规格化正数是多少?绝对值最大的负数是多少?5、求有效信息位为01101110的海明码校验码。
第三章练习:5解释下列概念:PROM,EPROM,E2PROM,Flash memory,FPGA,SRAM和DRAM。
第四章总线的分类总线操作周期的四个传输阶段总线仲裁的概念及其分类异步通信方式的种类总线的最大传输率第五章存储器的分类存储容量的扩展RAID的概念、特点以及分类Cache的地址映射Cache的写策略Cache的性能分析3C练习:4,5,71.一个容量为16K×32位的存储器,其地址线和数据线的总和是多少?用下列存储芯片时,各需要多少片?1K×4位,2K×8位,4K×4位,16K×l位,4K×8位,8K×8位2.现有1024×l的存储芯片,若用它组成容量为16K×8的存储器。
(1)实现该存储器所需的芯片数量?(2)若将这些芯片分装在若干块板上,每块板的容量为4K×8,该存储器所需的地址线总数是多少?几位用于选片?几位用作片内地址?(3)画出各芯片的连接逻辑图。
Cx51编译器对传统和扩展的8051微处理器的优化的C 编译器和库参考用户手册09.2001Keil Software – Cx51编译器用户手册—ፉᑗኔፉᑗኔ由于本人的英语水平有限所以在使用KEIL C51的过程中老要去看那英文的手册总感到不是那么方便老要用词霸查来查去的烦的很因此在看到C51BBS上的倡议后就动了把它翻译出来的念头我想这对自己和别人都会带来些好处利用工作之余的时间经过几个月的努力终于把它翻译完了但由于水平所限文中肯定有很多不是十分恰当的地方或许没有用大家比较熟悉的惯用语或许可能引起误解所以在这里我请大家能指出其中的错误和不当之处请大家EMAIL告诉我使我能够作出改正对于大家的建议我会很高兴的接受我最大的愿望是希望我的翻译不会误导大家且能对大家有所帮助不明之处可以参考英文原文感谢C51BBS版主龙啸九天的帮助欢迎大家与我交流我的e-mail**************Keil Software声明本文档所述信息不属于我公司的承诺范围其内容的变化也不会另行通知本文档所述软件的出售必须经过授权或签订特别协议本文档所述软件的使用必须遵循协议约定在协议约定以外的任何媒体上复制本软件将触犯法律购买者可以备份为目的而做一份拷贝在未经书面许可之前本手册的任何一部分都不允许为了购买者个人使用以外的目的而以任何形式和任何手段(电子的机械的)进行复制或传播版权1988-2001所有者Keil Elektronik GmbH和Keil Software公司Keil C51™Keil CX51™,和uVision TM是Keil Elektronik GmbH的商标Microsoft®和Windows™是Microsoft Corporation的商标或注册商标IBM®PC®和PS/2®是International Business Machines Corporation的注册商标Intel®MCS®51MCS®251ASM-51®和PL/M-51®是Intel的注册商标我们尽全力去做来保证这本手册的正确从而保证我们个人公司和在此提及的商标的形象前言本手册讲述对8051的目标环境如何使用C x51优化C编译器编译C程序C x51编译器包可以用在所有的8051系列处理器上可以在WINDOWS 32位命令行中执行本手册假定你熟悉WINDOWS操作系统知道如何编程8051处理器并会用C语言编程注意本手册用条件窗口来指明32位WINDOWS版本是WINDOWS95WINDOWS98WINDOWS ME WINDOWS NT WINDOWS 2000或WINDWOS XP如果你对C编程有问题或者你想知道C语言编程的更多信息可参考16页的关于C 语言的书手册中讨论的许多例子和描述是从WINDOWS命令提示符下调用的这对在一个集成环境如µVision2中运行C x51的情况是不适用的本手册中的例子是通用的可以应用到所有编程环境手册组织本用户手册分成下面的章节和附录第一章介绍概述C x51编译器第二章用C x51编译解释怎样用C x51交叉编译器编译一个源文件本章叙述控制文件处理编译和输出的命令行提示第三章语言扩展叙述支持8051系统结构必须的C语言扩展本章提供一个在ANSI C说明中没有的命令函数和控制的详细列表第四章预处理器叙述C x51编译器预处理器的组成和包含的例子第五章派生的8051叙述C x51编译器支持的8051派生系列本章还包括能帮助提高目标程序性能的技巧第六章高级编程技术对有经验的开发人员的重要信息本章包括定制文件描述优化器详细资料和段名约定本章还讨论了C x51编译器产生的程序和别的8051编程语言如何接口第七章错误信息列出了在使用C x51编译器时可能遇到的致命错误语法错误和警告第八章库参考提高一个扩展的C x51库参考分类列出了库例程和相关的包含文件本章最后有一个按字母顺序的参考包括每个库例程的例子代码附录中包含不同编译器版本间的差异作品编号和别的有些信息文档约定本文档有下列约定README .TXT 粗体大写用在可执行程序名数据文件名源文件名环境变量和输入WINDOWS 命令行的命令上表示你必须手工输入的文本不一定要大写例CLS DIR BL51.EXELanguage Elements C 语言的构成包括关键词操作符和库函数用粗体例if != longisdigit main >>Courier 这种字体的文本代表显示在屏幕上或打印出的信息这字体也用在讨论或描述命令行中Variables 斜体字必须提供的信息例如在语法字符串中的projectfile 表示需要提供实际的工程文件名重复的成分…例子中使用的省略号…表示重复的成分省略代码 . . .垂直省略号用在源代码例子中表示省略一段程序例子void main(void ) {...while(1);[可选项]命令行中的可选参数和选择项用方括号表示例C51 TEST.C PRINT [(filename )]{opt1|opt2}大括号中的文本用竖线分隔代表一组选项必须从中选一项大括号中包含了所有选项竖线分隔选项KeysSans serif 字体的文本代表键盘的键例如按Enter 继续ContentsChapter 1. Introduction (15)Support for all 8051 Variants (15)Books About the C Language (16)Chapter 2. Compiling with the C x51 Compiler (17)Environment Variables (17)Running C x51 from the Command Prompt (18)ERRORLEVEL (19)C x51 Output Files (19)Control Directives (20)Directive Categories (20)Reference (23)AREGS / NOAREGS (24)ASM / ENDASM (26)BROWSE (28)CODE (29)COMPACT (30)COND / NOCOND (31)DEBUG (33)DEFINE (34)DISABLE (35)EJECT (37)FLOATFUZZY (38)INCDIR (39)INTERVAL (40)INTPROMOTE / NOINTPROMOTE (41)INTVECTOR / NOINTVECTOR (44)LARGE (46)LISTINCLUDE (47)MAXARGS (48)MOD517 / NOMOD517 (49)MODA2 / NOMODA2 (51)MODAB2 / NOMODAB2 (52)MODDA2 / NOMODDA2 (53)MODDP2 / NOMODDP2 (54)MODP2 / NOMODP2 (55)NOAMAKE (56)NOEXTEND (57)OBJECT / NOOBJECT (58)OBJECTADVANCE (59)OBJECTEXTEND (60)ONEREGBANK (61)OMF2 (62)OPTIMIZE (63)ORDER (65)PAGELENGTH (66)PAGEWIDTH (67)PREPRINT (68)PRINT / NOPRINT (69)REGFILE (70)REGISTERBANK (71)REGPARMS / NOREGPARMS (72)RET_PSTK, RET_XSTK (74)ROM (76)SAVE / RESTORE (77)SMALL (78)SRC (79)STRING (80)SYMBOLS (81)USERCLASS (82)VARBANKING (84)WARNINGLEVEL (85)XCROM (86)Chapter 3. Language Extensions (89)Keywords (89)Memory Areas (90)Program Memory (90)Internal Data Memory (91)External Data Memory (92)Far Memory (93)Special Function Register Memory (93)Memory Models (94)Small Model (94)Compact Model (95)Large Model (95)Memory Types (95)Explicitly Declared Memory Types (96)Implicit Memory Types (97)Data Types (97)Bit Types (98)Bit-addressable Objects (99)Special Function Registers (101)sfr (101)sfr16 (102)sbit (102)Absolute Variable Location (104)Pointers (106)Generic Pointers (106)Memory-specific Pointers (109)Pointer Conversions (111)Abstract Pointers (114)Function Declarations (118)Function Parameters and the Stack (119)Passing Parameters in Registers (120)Function Return Values (120)Specifying the Memory Model for a Function (121)Specifying the Register Bank for a Function (122)Register Bank Access (124)Interrupt Functions (125)Reentrant Functions (129)Alien Function (PL/M-51 Interface) (132)Real-time Function Tasks (133)Chapter 4. Preprocessor (135)Directives (135)Stringize Operator (136)Token-pasting operator (137)Predefined Macro Constants (138)Chapter 5. 8051 Derivatives (139)Analog Devices MicroConverter B2 Series (140)Atmel 89x8252 and Variants (141)Dallas 80C320, 420, 520, and 530 (142)Dallas 80C390, 80C400, 5240, and Variants (143)Arithmetic Accelerator (144)Infineon C517, C509, 80C537, and Variants (145)Data Pointers (145)High-speed Arithmetic (146)Library Routines (146)Philips 8xC750, 8xC751, and 8xC752 (147)Philips 80C51MX Architecture (148)Philips and Atmel WM Dual DPTR (148)Chapter 6. Advanced Programming Techniques (149)Customization Files (150)STARTUP.A51 (151)INIT.A51 (153)XBANKING.A51 (154)Basic I/O Functions (156)Memory Allocation Functions (156)Optimizer (157)General Optimizations (157)8051-Specific Optimizations (158)Options for Code Generation (158)Segment Naming Conventions (159)Data Objects (160)Program Objects (161)Interfacing C Programs to Assembler (163)Function Parameters (163)Parameter Passing in Registers (164)Parameter Passing in Fixed Memory Locations (165)Function Return Values (165)Using the SRC Directive (166)Register Usage (168)Overlaying Segments (168)Example Routines (168)Small Model Example (169)Compact Model Example (171)Large Model Example (173)Interfacing C Programs to PL/M-51 (175)Data Storage Formats (176)Bit Variables (176)Signed and Unsigned Characters, Pointers to data, idata, and pdata (177)Signed and Unsigned Integers, Enumerations, Pointers to xdata andcode (177)Signed and Unsigned Long Integers (177)Generic and Far Pointers (178)Floating-point Numbers (179)Floating-point Errors (182)Accessing Absolute Memory Locations (184)Absolute Memory Access Macros (184)Linker Location Controls (185)The _at_ Keyword (186)Debugging (187)Chapter 7. Error Messages (189)Fatal Errors (189)Actions (190)Errors (191)Syntax and Semantic Errors (193)Warnings (205)Chapter 8. Library Reference (209)Intrinsic Routines (209)Library Files (210)Standard Types (211)jmp_buf (211)va_list (211)Absolute Memory Access Macros (212)CBYTE (212)CWORD (212)DBYTE (213)DWORD (213)FARRAY, FCARRAY (214)FVAR, FCVAR, (215)PBYTE (216)PWORD (216)XBYTE (217)XWORD (217)Routines by Category (218)Buffer Manipulation (218)Character Conversion and Classification (219)Data Conversion (220)Math Routines (221)Memory Allocation Routines (223)Stream Input and Output Routines (224)String Manipulation Routines (226)Variable-length Argument List Routines (227)Miscellaneous Routines (227)Include Files (228)8051 Special Function Register Include Files (228)80C517.H (228)ABSACC.H (229)ASSERT.H (229)CTYPE.H (229)INTRINS.H (229)MATH.H (230)SETJMP.H (230)STDARG.H (230)STDDEF.H (230)STDIO.H (231)STDLIB.H (231)STRING.H (231)Reference (232)abs (233)acos / acos517 (234)asin / asin517 (235)assert (236)atan / atan517 (237)atan2 (238)atof / atof517 (239)atoi (240)atol (241)cabs (242)calloc (243)ceil (244)_chkfloat_ (245)cos / cos517 (246)cosh (247)_crol_ (248)_cror_ (249)exp / exp517 (250)fabs (251)floor (252)fmod (253)free (254)getchar (255)_getkey (256)gets (257)init_mempool (258)_irol_ (259)_iror_ (260)isalnum (261)isalpha (262)iscntrl (263)isdigit (264)isgraph (265)islower (266)isprint (267)ispunct (268)isspace (269)isupper (270)isxdigit (271)labs (272)log / log517 (273)log10 / log10517 (274)longjmp (275)_lrol_ (277)_lror_ (278)malloc (279)memccpy (280)memchr (281)memcmp (282)memcpy (283)memmove (284)memset (285)modf (286)_nop_ (287)offsetof (288)pow (289)printf / printf517 (290)putchar (296)puts (297)rand (298)realloc (299)scanf (300)setjmp (304)sin / sin517 (305)sinh (306)sprintf / sprintf517 (307)sqrt / sqrt517 (309)srand (310)sscanf / sscanf517 (311)strcat (313)strchr (314)strcmp (315)strcpy (316)strcspn (317)strlen (318)strncat (319)strncmp (320)strncpy (321)strpbrk (322)strpos (323)strrchr (324)strrpbrk (325)strrpos (326)strspn (327)strstr (328)strtod / strtod517 (329)strtol (331)strtoul (333)tan / tan517 (335)tanh (336)_testbit_ (337)toascii (338)toint (339)tolower (340)_tolower (341)toupper (342)_toupper (343)ungetchar (344)va_arg (345)va_end (347)va_start (348)vprintf (349)vsprintf (351)Appendix A. Differences from ANSI C (353)Compiler-related Differences (353)Library-related Differences (353)Appendix B. Version Differences (357)Version 6.0 Differences (357)Version 5 Differences (358)Version 4 Differences (359)Version 3.4 Differences (361)Version 3.2 Differences (362)Version 3.0 Differences (363)Version 2 Differences (364)Appendix C. Writing Optimum Code (367)Memory Model (367)Variable Location (369)Variable Size (369)Unsigned Types (370)Local Variables (370)Other Sources (370)Appendix D. Compiler Limits (371)Appendix E. Byte Ordering (373)Appendix F. Hints, Tips, and Techniques (375)Recursive Code Reference Error (375)Problems Using the printf Routines (376)Uncalled Functions (377)Using Monitor-51 (377)Trouble with the bdata Memory Type (378)Function Pointers (379)Glossary (383)Index (391)ጙᐺC语言是一个通用的编程语言它提供高效的代码结构化的编程和丰富的操作符C不是一种大语言不是为任何特殊应用领域而设计它一般来说限制较少可以为各种软件任务提供方便和有效的编程许多应用用C比其他语言编程更方便和有效优化的C x51 C编译器完整的实现了ANSI的C语言标准对8051来说C x51不是一个通用的C编译器它首先的目标是生成针对8051的最快和最紧凑的代码C x51具有C编程的弹性和高效的代码和汇编语言的速度C语言不能执行的操作如输入和输出需要操作系统的支持这些操作作为标准库的一部分提供因为这些函数和语言本身无关所以C特别适合对多平台提供代码既然C x51是一个交叉编译器C语言的某些方面和标准库就有了改变或增强以适应一个嵌套的目标处理器的特性更多的细节参考89页的第三章.语言扩展支持所有的8051变种8051系列是增长最快的微处理器构架之一从不同的芯片厂家提供了400多种芯片新扩展的8051芯片如PHILIPS 8051MX有几M字节的代码和数据空间可被用到大的应用中为了支持这些不同的8051芯片KEIL提供了几种开发工具如下表所列一个新的输出文件格式OMF2允许支持最多16MB代码和数据空间CX51编译器适用于新的PHILIPS 8051MX结构C51编译器A51宏汇编BL51连接器对传统的8051开发工具包括支持32 x64KB 的代码库C51编译器有OMF2输出AX51宏汇编LX51连接器对传统的8051和扩展的8051芯片如DALLAS 390的开发工具包括支持代码库和最多16MB代码和XDATA存储区CX51编译器AX51宏汇编LX51连接器对PHILIPS 8051MX的开发工具支持最多16MB 代码和XDATA存储区C x 51编译器在不同的包中提供上表是完整的8051开发工具参考注意Cx51指两种编译器C51编译器和CX51编译器C 语言的书有许多书介绍C 语言有更多的书详细介绍用C 完成的任务下面的列表不是一个完整的列表列表只是作为参考The C Programming Language, Second Edition Kernighan & RitchiePrentice-Hall, Inc.ISBN 0-13-110370-9C: A Reference Manual, Second EditionHarbison & SteelPrentice-Hall Software SeriesISBN 0-13-109810-1C and the 8051: Programming and MultitaskingSchultzP T R Prentice-Hall, Inc.ISBN 0-13-753815-4औᐺCx51ܠፉܠፉ本章说明怎样编译C源文件讨论编译器的控制命令这些命令可以命令C x51编译器产生列表文件控制包含在OBJ文件中的信息的数量指定优化级别和存储模式注意一般来说你应在µVision2 IDE中使用Cx51关于使用µVision2IDE的更多信息参考用户手册Getting Started with µVision2 and C51”.环境变量如果在µVision2IDE中运行Cx51编译器计算机不需要另外的设置如果想要在命令行中运行C x51编译器和工具必须手工创建下面的环境变量PATH\C51\BIN C51和CX51可执行程序的路径TMP编译器产生的临时文件的路径如果指定的路径不存在编译器会生成错误并停止编译C51INC\C51\INC Cx51头文件的路径C51LIB\C51\LIB Cx51库文件的路径对WINSOWS NT WINDOWS 2000和WINDOWS XP这些环境变量在Control Panel –System – Advanced – Environment Variables中输入对WINDOWS 95WINDOWS 98和WINDOWS ME这些设置放在AUTOEXEC.BAT中PATH=C\KEIL\C51\BIN;%PATH%SET TMP=D:\SET C51INC=C:\KEIL\C51\INCSET C51LIB=C:\KEIL\C51\LIB从命令行运行Cx51调用C51或CX51编译器在命令行输入C51或CX51在命令行中必须包含要编译的C源文件和必需的编译控制命令C x51命令行的格式C51 sourcefile [directives…]CX51 sourcefile [directives…]或C51 @commandfileCX51 @commandfile这里sourcefile要编译的源文件名directives用来控制编译器功能的命令参考20页的控制命令commandfile包含源文件名和命令的命令输入文件当C x51调用行较复杂超过了WINDOWS命令行的限制时使用commandfile下面的命令行例子调用C51指定源文件SAMPLE.C用控制DEBUG CODE和PREPRINTC51 SAMPLE.C DEBUG CODE PREPRINTC x51编译器在成功编译后显示下面的信息C51 COMPILER V6.10C51 COMPILATION COMPLETE. 0 WARNING S0 ERROR S错误级别在编译后错误和警告的数目输出在屏幕上C x51编译器设置ERRORLEVEL指示编译的状态值如下表所列0没有错误或警告1只有警告2错误和可能的警告3致命错误可以在批处理文件中访问ERRORLEVEL变量关于ERRORLEVEL或批处理文件可以参考WINDOWS命令索引或在线帮助Cx51输出文件C x51编译器在编译时产生许多输出文件缺省的输出文件和源文件同名但文件的扩展名不同下面的表列出了文件并有简短的说明Filename.LST列表文件包含格式化的源文件和编译中检测到的错误列表文件可以选择包含所用的符号和生成汇编代码更多的信息参考PRINT命令Filename.OBJ包含可重定位目标代码的OBJ模块OBJ模块用Lx51连接器连接到一个绝对的OBJ模块Filename.I包含由预处理器扩展的源文件所有的宏都扩展了所有的注释都删除了可参考PREPRINT命令Filename.SRC C源代码产生的汇编源文件可以用A51汇编可参考SRC命令控制命令C x51编译器提供许多控制命令控制编译除了指定的命令由一个或多个字母或数字组成在命令行中在文件名后指定或在源文件中用#pragma命令例如C51 testfile.c SYMBOLS CODE DEBUG#pragma SYMBOLS CODE DEBUG在说明的例子中SYMBOLS CODE和DEBUG都是控制命令testfile.C是要编译的源文件注意对命令行和#pragma语法是相同的在#pragma可指定多个选项典型的每个控制命令只在源文件的开头指定一次如果一个命令指定多次编译器产生一个致命错误退出编译可以指定多次的命令在下面部分注明命令种类控制命令可以分成三类源文件控制目标控制和列表控制源文件控制定义命令行的宏定义要编译的文件名目标控制影响产生的目标模块*.OBJ的形式和内容这些命令指定优化级别或在OBJ文件中包含调试信息列表控制管理列表文件*.LST的各种样式特别是格式和指定的内容上下表按字母顺序列出了控制命令有下划线的字母表示命令的缩写AREGS NOAREGS Object 使能或不使能绝对寄存器ARn地址ASM ENDASM Source 标志内嵌汇编块的开始和结束BROWSE †Object 产生浏览器信息CODE †Listing 加一个汇编列表到列表文件COMPACT †Object 设置COMPACT 存储模式COND NOCOND †Listing 包含或执行预处理器跳过的源程序行DEBUG †Object 在OBJ 文件中包含调试信息DEFINE Source 在Cx51调用行定义预处理器名DISABLE Object 在一个函数内不允许中断EJECTListing 在列表文件中插入一个格式输入字符FLOATFUZZY Object 在浮点比较中指定位数INCDIR †Source 指定头文件的附加路径名INTERVAL †Object 对SIECO 芯片指定中断矢量间隔INTPROMOTE NOINTPROMOTE†Object 使能或不使能ANSI 整数同时提升INTVECTOR NOINTVECTOR †Object 指定中断矢量的基地址或不使能矢量LARGE †Object 选择LARGE 存储模式LISTINCLUDE Listing 在列表文件中显示头文件MAXAREGS †Object 指定可变参数列表的大小MOD517NOMOD517Object 使能或不使能代码支持80C517和派生的额外的硬件特征MODA2NOMODA2Object 使能或不使能ATMEL 82x8252和变种的双DPTR 寄存器MODAB2NOMODAB2Object 使能或不使能模拟设备ADuC B2系列支持双DPTR 寄存器MODDA NOMODDA Object 使能或不使能DALLAS 80C39080C400和5240支持算法加速器MODDP2NOMODDP2Object 使能或不使能DALLAS 的320520530550和变种支持双DPTR 寄存器MODP2NOMODP2Object 使能或不使能PHILIPS 和ATMELWM 派生的支持双DPTR 寄存器NOAMAKE †Object 不记录µVision2更新信息NOEXTEND †Source Cx51不扩展到ANSI COBJECT NOOBJECT †Object 指定一个OBJ 文件或禁止OBJ 文件OBJECTEXTEND†Object 在OBJ 文件中包含变量类型信息ONEREGBANKObject假定在中断中只用寄存器组0OMF2†Object 产生OMF2输出文件格式OPTIMIZE Object 指定编译器的优化级别ORDER †Object 按源文件中变量的出现顺序分配PAGELENGTH †Listing 指定页的行数PAGEWIDTH †Listing 指定页的列数PREPRINT †Listing 产生一个预处理器列表文件扩展所有宏PRINTNOPRINT †Listing 指定一个列表文件名或不使能列表文件REGFILE †Object 对全局寄存器优化指定一个寄存器定义文件REGISTERBANK Object 为绝对寄存器访问选择寄存器组REGPARMS NOREGPARMS Object 使能或不使能寄存器参数传递RET_PSTK † RET_XSTK †Object 用重入堆栈保存返回地址ROM †Object AJMP/ACALL 指令产生控制SAVERESTORE Object 保存和恢复AREGS REGPARMS 和OPTIMIZE 命令设置SMALL†Object 选择SMALL 存储模式缺省SRC †Object 产生一个汇编源文件不产生OBJ 模块STRING †Object 定位固定字符串到XDATA 或远端存储区SYMBOLS †Listing 模块中所有符号的列表文件USERCLASS †Object 对可变的变量位置重命名存储区类VARBANKING †Object 使能FAR 存储类型变量WARNINGLEVEL†Listing 选择警告检测级别XCROM †Object对CONST XDATA 变量假定ROM 空间† 这些命令在命令行或源文件开头的#pragma中只指定一次在一个源文件中不能使用多次控制命令和参数除了用DEFINE 命令的参数是大小写无关的参考本章的余下部分按字母顺序描述C x51编译器控制命令他们分成如下部分缩写可以替代命令的缩写参数命令可选和要求的参数缺省命令的缺省设置µVision2控制怎样指定命令说明详细的说明命令和使用参考相关命令例子命令使用的例子有时也列出结果AREGS/NOAREGS缩写无参数无缺省AREGSµVision2控制Options – C51 – Don‘t use absolute register access说明AREGS控制使编译器对寄存器R0到R7用绝对寄存器地址绝对地址提高了代码的效率例如PUSH和POP指令只能用直接或绝对地址用AREGS命令可以直接PUSH或POP寄存器可用REGISTERBANK命令定义使用的寄存器组NOAREGS命令对寄存器R0到R7不使能绝对寄存器地址用NOAREGS编译的函数可以使用所有的8051寄存器组命令可用在被别的函数用不同的寄存器组调用的函数中注意虽然可能在一个程序中定义了几次AREGS/NOAREGS选项只有定义在函数声明为有效例子下面是一个使用NOAREGS 和AREGS 的源程序和代码的列表注意保存R7到堆栈中的不同方法函数noaregfunc 产生的代码是MOV A R7PUSHACC同时对aregfunc 函数的代码是PUSHAR7stmt levelsource1extern char func ();2char k;34#pragma NOAREGS 5noaregfunc (){61k =func ()+func ();71}89#pragma AREGS 10aregfunc (){111k =func ()+func ();121};FUNCTION noaregfunc (BEGIN);SOURCE LINE #60000120000E LCALL func 0003EF MOV A,R70004C0E0PUSH ACC 0006120000E LCALL func 0009D0E0POP ACC 000B 2F ADD A,R7000C F500R MOV k,A;SOURCE LINE #7000E22RET;FUNCTION noaregfunc (END);FUNCTION aregfunc (BEGIN);SOURCE LINE #110000120000E LCALL func 0003C007PUSH AR70005120000E LCALL func 0008D0E0POP ACC 000A 2F ADD A,R7000B F500R MOV k,A;SOURCE LINE #12000D22RET;FUNCTION aregfunc (END)ASM/ENDASM缩写无参数无缺省无µVision2控制本命令不能在命令行指定说明ASM命令标志一块源程序的开始它可以直接合并到由SRC命令产生的.SRC文件中这些源程序可以认为是内嵌的汇编然而它只输出到由SRC命令产生的源文件中源程序不汇编和输出到OBJ文件中在µVision2应对C源文件中包含ASM/ENDASM段如下设置一个文件指定选项右键点击PROJECT窗口 – 文件表中的文件选择Options for…打开选项 – 属性页使能Generate Assembler SRC file使能Assemble SRC file用这些设置µVision2产生一个汇编源文件.SRC并用汇编编译产生一个OBJ文件.OBJENDASM命令标志一个源程序块的结束注意ASM和ENDASM命令只能在源文件中使用且作为#pragma命令的一部分例子#pragma asm / #pragma endasm 下面是C 源文件产生下面的.SRC 文件...stmt levelsource1extern void test ();23main (){41test ();5161#pragma asm 71JMP $;endless loop 81#pragma endasm 91}..;ASM.SRC generated from:ASM.C NAME ASM PRmainASM SEGMENT CODE EXTRN CODE (test)EXTRN CODE (?C_STARTUP)PUBLIC main;extern void test ();;;main (){RSEG ?PR?main?ASM USING 0main:;SOURCE LINE #3;test ();;SOURCE LINE #4LCALL test;;#pragma asmJMP $;endless loop;#pragma endasm ;};SOURCE LINE #9RET ;END OF mainENDBROWSE缩写BR参数无缺省不创建浏览信息µVision2控制Options – Output – Browse Information说明用BROWSE编译器产生浏览信息浏览信息包括标识符包含预处理器符号他们的存储空间类型定义和参考列表信息可以在µVision2内显示选择View – Source Browser打开µVision2源浏览器参考µVision2用户手册第四章µVision2功能源浏览器例子C51 SAMPLE.C BROWSE#pragma browseCODE缩写CD参数无缺省不产生汇编代码列表µVision2控制Options – Listing – C Compiler Listing – Assembly Code说明CODE命令附加一个汇编助记符列表到列表文件汇编程序代码代表源程序中的每个函数缺省的在列表文件中没有汇编代码例子C51 SAMPLE.C CD#pragma code下面例子显示C源程序和它产生的OBJ结果代码和助记符在汇编间显示了产生代码的行号字符R和E代表可重定位和外部的stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61c=14+15*((b/c)+252);71}...ASSEMBLY LISTING OF GENERATED OBJECT CODE;FUNCTION main(BEGIN);SOURCE LINE#5;SOURCE LINE#60000E500E MOV A,b00028500F0R MOV B,c000584DIV AB000675F00F MOV B,#0FH0009A4MUL AB000A24D2ADD A,#0D2H000C F500R MOV c,A;SOURCE LINE#7000E22RET;FUNCTION main(END)COMPACT缩写CP参数无缺省SMALLµVision2控制Options – Target – Memory Model说明本命令选择COMPACT存储模式在COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区外部数据存储区可有最多256字节一页在本模式中外部数据存储区的短地址用@R0/R1不管什么存储类型可以在任何8051的存储范围内声明变量但是把常用的变量如循环计数器和数组索引放在内部数据存储区可以显著的提高系统性能注意函数调用所用的堆栈经常放在IDATA存储区参考SAMLL LARGE ROM例子C51 SAMPLE.C COMPACT#pragma compactCOND/NOCOND缩写CO参数无缺省CONDµVision2控制Options – Listing – C Compiler Listing - Conditional说明本命令定义这些部分的受条件编译影响的源程序是否显示在列表文件中COND命令在列表文件中包含编译省略的行行号和嵌套级不输出以便于阅读本命令影响预处理器删除的行NOCOND命令不在列表文件中包含编译省略的行例子下面的例子显示用COND命令编译产生的一个列表文件...stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61#if defined(VAX)c=13;#elif defined(__TIME__)91b=14;101a=15;111#endif121}..下面的例子用NOCOND命令编译产生的一个列表文件...stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61#if defined(VAX)91b=14;101a=15;111#endif121}...缩写DB参数无缺省不产生调试信息µVision2控制Options – Output – Debug Information说明DEBUG命令指示编译器在OBJ文件中包含调试信息缺省OBJ 文件不包含调试信息对程序的符号测试必需有调试信息信息包括全局和局部变量定义和地址和函数名和行号包含在目标模块中的调试信息在连接过程中仍有效这些信息可以被µVision2调试器或任何INTEL兼容的模拟器使用注意OBJECTEXTEND命令用来指示编译器在目标文件中包含附加的变量类型定义信息参考OBJECTEXTEND例子C51 SAMPLE.C DEBUG#pragma db缩写DF参数一个或多个符合C语言约定的的名称用逗号分隔对每个名称可有一个参数用DEFINE给出缺省无µVision2控制在Options –C x51 – Define输入名称说明DEFINE命令定义调用行的名称预处理器要用#if#ifdef和#ifndef查询这些名称定义的名称在输入后被复制这些命令是大小写相关的作为一个选项每个名称可跟一个值注意DEFINE命令只能在命令行中指定在一个C源程序中用C预处理器命令#define例子C51 SAMPLE.C DEFINE check,NoExtRamC51 MYPROG.C DF (X1=“1+5”,iofunc=“getkey()”)DISABLE缩写无参数无缺省无µVision2控制本命令不能在命令行中指定只能在源文件中指定说明DISABLE命令指示编译器在产生代码时在一个函数内不使能所有中断DISABLE必须在一个函数声明前一行用#pragma命令指定DISABLE控制只用到一个函数对每个新的函数必须重新指定注意DISABLE只能用#pragma命令指定不能在命令行指定DISABLE可在一个源文件中指定多次对每个函数只能指定一次执行后不使能中断一个不使能中断的函数不能对调用者返回一个位值例子本例子是一个用DISABLE命令函数的源程序和代码列表注意EA指定函数寄存器在函数进入时清除JBC EA C002在结尾时恢复MOV EA C...stmt level source1typedef unsigned char uchar;23#pragma disable/*Disable Interrupts*/4uchar dfunc(uchar p1,uchar p2){51return(p1*p2+p2*p1);61};FUNCTION_dfunc(BEGIN)0000D3SETB C000110AF01JBC EA,?C00020004C3CLR C0005?C0002:0005C0D0PUSH PSW;----Variable'p1'assigned to register'R7'----;----Variable'p2'assigned to register'R5'----;SOURCE LINE#4;SOURCE LINE#50007ED MOV A,R500088FF0MOV B,R7000A A4MUL AB000B25E0ADD A,ACC000D FF MOV R7,A;SOURCE LINE#6000E?C0001:000E D0D0POP PSW001092AF MOV EA,C001222RET;FUNCTION_dfunc(END)...EJECT缩写EJ参数无缺省无µVision2控制本命令不能在命令行中指定只能在源文件中指定说明EJECT命令在列表文件中插入一个格式输入字符注意EJECT只在源文件中出现必须是#pragma命令的一部分例子#pragma ejectFLOATFUZZY缩写FF参数0到7间的一个数字缺省FLOATFUZZY3µVision2控制Options - C x51 – Bits to round for float compare说明FLOATFUZZY命令在一个浮点比较前定义位数缺省值3指定最少有三个有效位例子C51 MYFILE.C FLOATFUZZY2#pragma FF(0)INCDIR缩写无参数指定头文件的路径缺省无µVision2控制Options - C x51 – Include Paths说明INCDIR命令指定Cx51编译器头文件的位置编译器最多50个路径声明如果需要多个路径路径名必须用分号分开如果指定#include“filename.h”Cx51编译器首先搜索当前目录然后是源文件目录当找不到或用了#include <filename.h>就搜索INCDIR指定的路径当仍找不到就使用C51INC环境变量指定的路径例子C51 SAMPLE.C INDIR C\KEIL\C51\MYINC;C:\CHIP-DIRINTERVAL缩写无参数对中断矢量表可选用括号括住缺省INTERV AL8µVision2控制Options - C x51 – Misc controls:enter the directive说明INTERV AL命令指定中断矢量的间隔指定间隔是SIECO-51派生系列要求的它定义中断矢量在3字节间隔用本命令编译器定位中断矢量在绝对地址如下计算(interval×n)+offset+3,这里interval INTERV AL命令的参数缺省为8n中断号offset INTVECTOR命令的参数缺省为0参考INTVECTOR/NOINTVECTOR例子C51 SAMPLE.C INTERV AL3#pragma interval(3)INTPROMOTE/NOINTPROMOTE缩写IP/NOIP参数无缺省INTPROMOTEµVision2控制Options - C x51 – Enable ANSI integer promotion rules说明INTPROMOTE命令使能ANSI整数提升规则如果提升声明了在比较前所用的表达式从小类型提升到整数表达式这使MICROSOFT C和BORLAND C改动很少就可用到Cx51上因为8051是8位处理器使用INTPROMOTE命令可能在某些应用中降低效率NOINTPROMOTE命令不使能自动整数提升整数提升使Cx51和别的ANSI编译器间有更大的兼容性然而整数提升可能降低效率例子C51 SAMPLE.C INTPROMOTE#pragma intpormoteC51 SAMPLE.C NOINTPROMOTE下面的代码示范用INTPROMOTE和NOINTPROMOTE命令产生的代码stmt lvl source1char c;2unsigned char c1,c2;3int i;45main(){61if(c==0xff)c=0;/*never true!*/71if(c==-1)c=1;/*works*/81i=c+5;91if(c1<c2+4)c1=0;101};FUNCTION main(BEGIN);SOURCE LINE#60000AF00MOV R7,c0002EF MOV A,R7000333RLC A000495E0SUBB A,ACC0006FE MOV R6,A0007EF MOV A,R70008F4CPL A00094E ORL A,R6000A7002JNZ?C0001000C F500MOV c,A000E?C0001:;SOURCE LINE#7000E E500MOV A,c0010B4FF03CJNE A,#0FFH,?C0002 0013750001MOV c,#01H0016?C0002:;SOURCE LINE#80016AF00MOV R7,c0018EF MOV A,R7001933RLC A001A95E0SUBB A,ACC001C FE MOV R6,A001D EF MOV A,R7001E2405ADD A,#05H0020F500MOV i+01H,A0022E4CLR A00233E ADDC A,R60024F500MOV i,A;SOURCE LINE#90026E500MOV A,c200282404ADD A,#04H002A FF MOV R7,A002B E4CLR A002C33RLC A002D FE MOV R6,A002E C3CLR C002F E500MOV A,c100319F SUBB A,R70032EE MOV A,R600336480XRL A,#080H0035F8MOV R0,A00367480MOV A,#080H003898SUBB A,R000395003JNC?C0004003B E4CLR A003C F500MOV c1,A;SOURCE LINE#10003E?C0004:003E22RET;FUNCTION main(END);FUNCTION main(BEGIN);SOURCE LINE#60000AF00MOV R7,c0002EF MOV A,R7000333RLC A000495E0SUBB A,ACC0006FE MOV R6,A0007EF MOV A,R70008F4CPL A00094E ORL A,R6000A7002JNZ?C0001000C F500MOV c,A000E?C0001:;SOURCE LINE#7000E E500MOV A,c0010B4FF03CJNE A,#0FFH,?C0002 0013750001MOV c,#01H0016;SOURCE LINE#80016E500MOV A,c00182405ADD A,#05H001A FF MOV R7,A001B33RLC A001C95E0SUBB A,ACC001E F500MOV i,A00208F00MOV i+01H,R7;SOURCE LINE#90022E500MOV A,c200242404ADD A,#04H0026FF MOV R7,A0027E500MOV A,c10029C3CLR C002A9F SUBB A,R7002B5003JNC?C0004002D E4CLR A002E F500MOV c1,A;SOURCE LINE#100030?C0004:003022RET;FUNCTION main(END)CODE SIZE = 63 Bytes CODE SIZE = 49 BytesINTVECTOR/NOINTVECTOR缩写IV/NOIV参数对中断矢量表一个可选的偏移在括号中缺省INTVECTOR0µVision2控制Options - C x51 – Misc controls:enter the directive说明INTVECTOR命令指示编译器对要求的函数产生中断矢量如果矢量表不从0开始需输入一个偏移用本命令编译器产生一个中断矢量入口根据ROM命令指定的程序存储区用AJMP或LJMP指令跳转NOINTVECTOR命令禁止产生中断矢量表这也许用户用别的编程工具提供中断矢量编译器通常用一个3字节跳转指令LJMP产生一个中断矢量矢量用绝对地址表示(interval × n) + offset + 3,这里n中断号interval INTERV AL命令的参数缺省为8offset INTVECTOR命令的参数缺省为0参考INTERV AL。
tscript 手册TScript手册第一章:介绍1.1 什么是TScriptTScript是一种脚本语言,用于编写和运行在TScript虚拟机上的程序。
它是一种功能强大、简洁灵活的语言,可以用于各种领域的开发,包括网站开发、游戏开发和科学计算等。
1.2 TScript的特点TScript具有以下几个特点:- 简洁易学:TScript语法简单,易于理解和学习。
- 高效性能:TScript代码经过优化后,在TScript虚拟机上可以实现高效的执行速度。
- 跨平台:TScript可以运行在多种操作系统和平台上,包括Windows、Linux和Mac OS等。
- 扩展性强:TScript支持通过C扩展库来扩展其功能,可以方便地调用C函数和类。
1.3 TScript的应用领域TScript可以应用于各种场景和领域,包括但不限于以下几个方面:- 网站开发:可以使用TScript编写网页动态效果,实现与用户的交互。
- 游戏开发:TScript可以用于编写游戏逻辑、AI算法等。
- 科学计算:TScript提供了丰富的数学库和科学计算功能,可以应用于科学计算领域。
第二章:语法基础2.1 变量和数据类型TScript支持多种数据类型,包括整数、浮点数、字符串、布尔值和数组等。
变量在使用前需要先声明。
2.2 运算符TScript支持常见的运算符,包括算术运算符、关系运算符、逻辑运算符和赋值运算符等。
2.3 控制流程TScript提供了条件语句、循环语句和函数等控制流程结构,可以实现复杂的逻辑。
第三章:函数和模块3.1 函数TScript中可以定义函数,函数可以接受参数并返回值。
函数可以被其他函数调用和嵌套。
3.2 模块TScript支持模块化编程,可以将相关的函数和变量放在一个模块中,方便管理和复用。
第四章:异常处理4.1 异常处理基础TScript提供了异常处理机制,可以捕获和处理程序运行过程中发生的异常。
4.2 异常类型TScript定义了一些常见的异常类型,包括空指针异常、类型错误异常等。
C语言程序设计– 第二章课后习题电子13-02班王双喜一、选择题1. 下面四个选项中,均是合法整型常量的选项是(A)A. 160,-0xffff,011B. -0xcdf,01a,0xeC. -01,986,012,0668D. -0x48a,2e5,0x2. 设C语言中,一个short int型数据在内存中占2个字节,则unsigned short int型数据的取值范围为(C)A. 0~255B. 0~32767C. 0~65535D. 0~2147483647(解释:unsigned 类型是无符号数,其最小值是0;两个字节能表示216 = 65536种状态,因此其范围便是0~65535)3. 下面四个选项中,均是合法的浮点数的选项是(C)A. 160,0.12,e3B. 123,2e4.2,.e5C. -.18,123e4,0.00D. –e3,.234,1e34. 在C语言中,char型数据在内存中存储的是字符的(D)A. 补码B. 反码C. 原码D. ASCII码5. 若有定义“char c = ‘\72’”(A)A. 包含1个字符B. 包含2个字符C. 包含3个字符D. 不合法,c的值不确定(解释:C程序中,反斜杠“\”是转义字符,按照规定“72”表示的应当是一个八进制数,因此c中存放的是二进制代码为01110010的ASCII(美国标准信息交换码))6. 若有以下定义,则能使其值为3的表达式是(D)int k = 7, x = 12;A. x %= (k %= 5)B. x %= (k - k % 5)C. x %= k - k % 5D. (x %= k) – (k %= 5)7. 执行逗号表达式a = 3, b = 5, a -=a+b,b = a-b之后,a和b的值分别为(D)A. 3和5B. -5和-2C. 8和3D. -5和-10(解释:逗号运算符的计算顺序是从左往右的,且每个表达式的运算完毕后相关变量立即生效)8. 设有定义:char x = 3, y = 6, z;,则执行语句z = x ^ y<<2;后,z的二进制值是(B)A. 00010100B. 00011011C. 00011100D. 00011000(解释:移位运算符优先级高于按位或运算符,因此z = 00011 xor 11000)9. 设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是(B)A. n = (n*100 + 0.5)/100.0B. m = n*100 + 0.5, n = m/100.0C. n=n*100+0.5/100.0D. n = (n/100+0.5)*100.0(解释:要想保留小数点后两位应现将其第三位变成十分位然后再加0.5使其转换成整型变量后能实现四舍五入,而后再除以100.0而不是100是为了防止整个表达式沦为整型表达式而导致小数被舍弃)10. 下列程序执行后的输出结果是(小数点后只写一位)(A)A. 6 6 6.0 6.0B. 6 6 6.7 6.7C. 6 6 6.0 6.7D. 6 6 6.7 6.0# include <stdio.h>main(){double d; float f; long l; int i;i = f = l = d = 20 / 3;printf(“%d %d %f %f \n”, i, l, f, d);}(解释:由于“20 / 3”是操作数都是整型,小数部分将被舍去)11. 若变量已正确定义并赋值,下面符合C语言语法的是(B)A. a := b + 1B. a = b = c + 2C. int 18.5 % 3D. a = a + 7 = c + b(解释:A、C均不合法,D中赋值运算符的左值必须是一个变量)12. 若变量a、i已正确定义,且i已正确赋值,合法的语句是(B)A. a==1B. ++i;C. a = a++ = 5;D. a = int(i);(解释:A没有分号)13. 若有定义:int a = 7; float x = 2.5, y = 4.7;,则表达式x + a % 3 * (int)(x + y) % 2 / 4的值是(A)A. 2.5B. 2.75C. 3.5D. 0.0(解释:按照运算符的优先级不难得出结果;注意当运算符的操作数都是整型时,其结果也是整型)14. 设变量a是整型,f是单精度型,i是双精度型,则表达式10 + ’a’ + i * f值的数据类型为(C)A. intB. floatC. doubleD. 不确定(解释:i是双精度类型,因此整个表达式的类型就是双精度型。