《C语言程序设计》基本知识点解答.doc_第1页
《C语言程序设计》基本知识点解答.doc_第2页
《C语言程序设计》基本知识点解答.doc_第3页
《C语言程序设计》基本知识点解答.doc_第4页
《C语言程序设计》基本知识点解答.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计基本知识点解答(二)第三章 数据类型、运算符和表达式Q051什么是“数据类型”?(数据类型)A051数据类型就是指数据在计算机中保存和运算时的组织和形式。实际问题当中本来就有若干种不同类型的数据,因此用来解决这些实际问题的计算机编程语言中自然应该有对应的数据类型来描述这些数据。比如最基本的数据类型就是整数、实数,另外还有非数值型的数据类型,如字符串。一个计算机程序中用到的所有数据都必须具有某种类型。Q052什么是“运算符”?(运算符)A052运算符是指一些具有规定运算功能的特定的符号。如+、-、*、/、%等等。这里的运算功能可能是我们比较熟悉的运算比如算术运算(加减乘除)、逻辑运算(与或非)或比较运算(大于小于等于),也可能是其他一些在计算机语言当中特有的运算如加1减1运算、位运算等等。C语言共有34种运算符。Q053什么是“表达式”?(表达式)(优先级)(结合性)A053表达式是按照运算符的性质,用运算符把数据连接起来以达到数据运算目的而构成的式子。写表达式的最终目的是要进行计算它求出它的值。求解表达式的过程是由计算机完成的,因此,要想得到正确的结果,就必须写出正确的表达式。而一个表达式中往往包含多个运算符,所以必须熟悉每一种运算符的性质(优先级别和结合性),才能写出有正确求解结果的表达式。Q054C语言有哪些数据类型?(数据类型)A054C语言中的所以数据类型如下图所示:Q055什么是“常量”?(常量)A055程序运行期间,值不能被改变的量称为常量。如果试图去改变常量的值,就肯定会出错。在C语言中,至少有两种方法表示一个常量,即“直接常量”和“符号常量”。Q056什么是“直接常量”?(常量)A056直接常量也叫字面常量,就是一看就知道的、直接具有具体的固定的值的量。比如1、2、 3;0.1、10.0;a,1;“hello”等。常量也是有类型的。前面所列举的常量就分别是整型、实型、字符型和字符串型的常量。Q057什么是“符号常量”?(常量)(符号常量)A057直接常量的好处是一看就知道的它的值,但是缺点是读程序的人无法方便的知道这个值到底代表什么含义,即这个值传达的信息是不完整不明确的。这样的数常常被称之为“幻数(Magic Number)”。如果我们可以给这些数值起一个有意义有具体含义的名字就可以解决这个问题了。符号常量的目的就在此。它是用一些符号来代替程序当中出现的常量。从而使得程序的可读性和可维护性大大增强。Q058C语言中,如何实现“符号常量”?(常量)(符号常量)A058C语言中,可以使用 #define 预处理命令来实现符号常量。例如下面的程序:#define PI 3.14159int main() float r, c, s, v; r = 2; printf(PI = %fn, PI); c = 2 * PI * r; printf(周长 = %fn, c); s = PI * r * r; printf(面积 = %fn, s); v = 4 * PI * r * r * r / 3; printf(体积 = %fn, v); return 0;第一步,程序第一行用 #define 预处理命令定义了一个符号常量,其名字是PI,代表的常量值是3.14159。第二步,在本程序以下的代码中,凡是原来直接出现3.14159的地方,全部换成符号PI。这样修改后程序运行的结果和直接使用字面常量是一样的。Q059用 #define 实现符号常量的原理是什么?(符号常量)(define)A059实际上是一个在预处理阶段的替换过程。在前述问题的程序中,第一行的含义就是定义了一个符号名字叫做PI,它代替的一串字符是3.14159。然后,在对这个程序进行编译时,编译器首先启动预编译器(preprocessor)对源程序进行预编译处理。当预编译器发现程序中有诸如#define这样的预编译命令时,就对它们进行相应命令指定的处理。比如,对于#define预编译命令,预编译器就扫描整个源程序代码,将其中所有出现的由#define定义的符号全部替换成在#define命令行定义的符号后出现的字符串。因此,上述程序在预编译处理后,就变成了int main() float r, c, s, v; r = 2; printf(PI = %fn, 3.14159); c = 2 * 3.14159 * r; printf(周长=%fn, c); s = 3.14159 * r * r; printf(面积=%fn, s); v = 4 * 3.14159 * r * r * r / 3; printf(体积=%fn, v); return 0;因此就如同直接使用字面常量一样了。Q060使用“符号常量”的好处是什么?(符号常量)A060两个主要的好处:(1) 从所起的符号名字中可以清楚地看出该常量的含义,从而做到“见名知意”,避免“幻数”。比如上述程序中阅读此程序的人很容易的由符号名PI知道这个常量的含义就是圆周率。当然要想达到这样的效果,前提是所起符号名称必须和实际含义相符合。因为符号是可以任意命名的,你完全可以用这样的#define命令 #define PRICE 3.14159来定义一个符号PRICE代替3.14159,但是这样作就失去符号常量的存在意义了。(2) 在需要修改常量的值时可以做到“一改全改”,减少工作量。如果一个常量的值发生了变化,如果原来是用直接常量实现的,那么很显然程序的修改工作量就很大,尤其是当这个常量出现次数很多的时候。但是,如果用符号常量来实现的话,那么只需要改动一个地方,就是#define命令这个地方,而程序其它部分完全不需改动,因为在进行预编译时新的常量值会被正确的替换进去。Q061为什么在Q058的程序中,第5行的第一个PI没有被替换成3.14159?(符号常量)A061在预编译器对源程序代码当中出现的符号常量进行替换时,并不是凡是发现有相同的符号名就无条件替换。至少有两种情况下,这个替换不会发生:第一:这个符号出现在双引号当中。双引号括起来的叫做字符串常量,要的就是其中包含的原义字符,所以不会被替换;第二:这个符号不是单独且完整出现的,而是另一个符号的一部分。比如,定义了符号常量PI,那么代码中如果有另一个符号叫API,那么替换不会发生,即不会变成A3.14159。Q062什么是“预编译”?(预编译)A062预编译也叫编译预处理:是指在对源程序进行正式编译之前所作的一些处理。这些处理是由预处理命令指定的。源程序经过预处理后,再由编译程序进行正式的编译。预处理命令虽然用在C程序中,但它并不是语言本身的组成部分,不能用C编译器直接对它进行编译,必须由预编译器来处理。预处理命令都是以符号“#”开头的。Q063什么是“变量”?(变量)A063程序运行期间,值可以被改变的量称为变量。C程序允许把数值存放在变量中,每个变量都由一个变量名来标识。每个变量都必须有一个变量类型。每个变量根据它的类型不同,在内存中占据一定数目的字节单元,该变量的值就存放在这些内存单元中。Q064“变量”的本质是什么?(变量)A064变量的本质就是命名的内存单元,因此它的值可以被改变。所谓改变变量的值实际上是改变变量所占内存单元中的内容,因为变量名和内存单元的地址、变量值和内存单元的内容是相对应的。如图所示:Q065变量的名字是否可以随意命名?(变量)A065当然不是。任何计算机编程语言中,关于标志符号的命名总是有规定的。变量名就属于标志符的一种,其它的标志符还有符号常量名、数组名、函数名、构造类型名等等。C语言中,变量(标识符)的命名规定是: 只能由大小写字母、下划线和数字组成; 开头的第一个字符只能是大小写字母或下划线; 大小写是敏感的; 不能与C语言中的关键字重复; 名字在其作用范围内必须是唯一的; 名字的长度不能超过系统的规定。具体的长度限制随系统不同而不同。Q066在A065中提到的“关键字”是什么?(关键字)A066关键字(Keyword),也叫保留字(Reserve word),是计算机语言当中具有预先固定的命名的、能完成指定功能的符号。一种编程语言的很大一部分功能就是由关键字来完成的。C语言一共有32个关键字。其中,部分是用于定义变量类型的,如int、long、float、char等,部分是用于实现基本程序结构的,如if、switch、while、for等。可以这么说,关键字运算符就等于一门语言的绝大部分功能。Q067我听别人说过“好的变量名”,这是指什么?(变量名)A067理论上将,变量命名只要满足上述规定,任何名字都是可以的。但是,在给变量命名时,除了规定之外,还有一个良好的命名习惯的问题。即是说,首先要起合法的名字,其次要起好的名字。所谓好的变量名,最主要的要求就是要“见名知意”。别人通过变量的名字就可知道这个变量所保存信息的含义,这有助于增强程序的可读性。关于命名习惯,有如下建议: 避免使用无意义的名字,应严格做到“见名知意”; 尽量使用代表变量实际含义的英文单词或缩写作标识符名; 当名字包含多个单词时,通常使每个单词的首字母大写; 不使用以下划线开头的名字,因为这样的名字通常是系统内部保留的标识符名; 在整个程序中尽量保持统一的命名方式。Q068在编译程序时,提示有错,错误为“Error:Undefined symbol ??”,这是什么原因?(变量)(定义变量)A068“Undefined symbol”的意思是“为定义的符号”,就是说程序当中存在着还没有定义就直接使用的变量。这是因为C语言语法上要求,任何一个变量在使用之前必须先定义它。所谓定义一个变量,就是要在该变量被使用之前,告知编译器该变量的名字、类型和存储类别,这样编译器才能正确编译Q069那么,如何定义变量?(定义变量)A069变量定义具有三个目的: 定义变量名; 定义变量类型; 向程序员描述该变量。变量定义的一般格式是:type name; /*comment */类型 名字; /* 注释 */例如:intage;/* the age of student */floatscore;/* the score of student */floataverage;/* the average of score */longnumber;/* the number of student */doubledistance;/* between earth & moon */charUserSelection;/* key user hit */在程序运行时,系统将根据变量的定义为其分配相应大小的内存单元。Q070为什么在C语言中,整数017和17并不是相同的?(整型)A070这是因为在C语言中,17是十进制的整数,而017是八进制整数,相当于十进制的15。C语言中对于同一个整型常量,可以有三种不同的形式来表示,即分别用十进制、八进制、十六进制来表示同一个数。为了区分不同进制的整型常量,也为了和其它的标志符区分,C语言中规定,以数字“0”开头的整型常量是八进制的,而以“0x”开头的整型常量的整型是十六进制的。比如十进制整数18,就等价与八进制整数022,也等价与十六进制整数0x12。Q071在C语言中,整型变量是如何分类的?(整型)A071在C语言中,整型变量分为两大类:有符号整型和无符号整型。而不管是有符号还是无符号整型变量,又都分为基本整型、短整型和长整型三种。分类情况如下表所示:类型关键字占字节数目(Turbo C)有符号signed基本整型signed int2字节短整型signed short int(signed short)2字节长整型signed long int(signed long)4字节无符号unsigned基本整型unsigned int2字节短整型unsigned short int(unsigned short)2字节长整型unsigned long int (unsigned long)4字节其中,有符号整型变量中,关键字signed可以省略。Q072为什么C语言中,整型变量要分很多种?(整型)A072一方面是因为实际问题当中的数据本来就是具有不同的类型的,更主要的是因为这些数据的变化范围是不同的。不同范围的数据所需要的内存存储单元也是不一样的。因此,必须根据数据的范围来决定给它分配多大的存储空间,而不致发生空间不够或空间浪费的问题。这就好比学校的教学楼里,既有大教室,也有小教室,然后根据来上课的人数分配合适的教室。而不是全部都是大教室,那样就会产生教室不足或教室浪费的问题。C语言提供了多种整型数据类型,不同类型的整型数据占有的字节单元数目是不同的,所以不同类型的整型数据可表示的数的范围也是不同的,这样有助于根据实际数据的最大值来确定其最合适的类型。Q073那么,到底每种整型变量能保存的数据范围是多少呢?(整型)A073由于每一种整型数据占有的字节单元数目都是有限的,所以每一种整型数据可表示的数的范围也是有限的。ANSI C标准定义的整型类型的表示范围如下表所示:类型字节数有效表示范围signed int2字节-32768 +32767unsigned int2字节0 +65535signed short int2字节-32768 +32767unsigned short int2字节0 +65535signed long int4字节-2147483648 +2147483647unsigned long int4字节0 +4294967295Q074有符号和无符号的区别是什么?(整型)A074有符号和无符号的区别关键在于变量所占字节单元中“最高位”的性质。l 对于有符号变量:把最高位作为符号位保存数据的符号(0为正,1为负),其余位保存具体数值,因此可以用于正确保存限值范围内的正数或负数。比如有int a; 那么a的有效数值保存范围为 -3276832767。l 对于无符号变量:最高位不作为符号位,全部的位都用来保存数据的数值,因此可以用于正确保存限值范围内的正数。比如有unsigned int b; 那么b的有效数值范围为 065535。Q075为什么下面的程序中,输出的结果是over=-32768,而不是期望的over=32768? (整型)void main() int max, over; max = 32767; over = max + 1; printf(over = %d, over);A075因为发生了整型数据的“溢出”问题。前面已经说过,由于每一种整型数据占有的字节单元数目都是有限的,所以每一种整型数据可表示的数的范围也是有限的。程序中,max是int有符号基本整型的变量,所以其有效的数据保存范围就是-32768 +32767。当max等于32767时,实际其所占两个字节中的情况如图所示:max+1后赋值给同样的int有符号基本整型的变量over,则over中实际其所占两个字节中的情况如图所示,很显然已经变成了-32768的补码了。 所以用printf函数按照%d格式显示出来就是-32768。Q076那怎样才不会出现“整型数据溢出”的问题呢?(整型)A076解决的方法就是,在定义变量时一定要指定合适的类型,保证它所保存的数据在整个程序运行过程中不会超出其能够有效表示的范围。比如,上面的程序中,如果把over定义成unsigned int或long型的变量就可以避免“溢出”的问题。Q077实型变量是如何分类的?(实型)A077实型变量的分类如下表所示:类型单精度双精度关键字floatdouble字节数4 字节8 字节有效数字位数67位1516位数值范围10-3710+3810-30710+308很明显,由于不同的实型数据是用不同数目的有限字节单元保存的,所以它们能表示的数值范围是不同的,能保留的有效数字位数也是不同而且是有限的。Q078实型数据在内存中是如何存储的?(实型)A078实型数据在内存中是以“尾数”和“阶码”的形式存放的。即在一个实型数据(浮点数)所占字节单元中,一部分位用来保存阶码,一部分位用来保存尾数。如图所示:不同的编译系统位数分配不同。总之,尾数部分位数越多,可以表示的数的有效数字位数就越多,精度就越高;阶码部分位数越多,可以表示的数的范围就越大。Q079什么是字符型常量?(字符型)A079的字符常量是用单引号()括起来的一个字符。比如:a、A、d、D、?、%、$、2、4等等。注意两点:第一,必须是单引号,第二,单引号里只能有一个字符。Q080为什么字符常量要用单引号括起来?(字符型)A080这是为了和程序中其它类型的数据区分开来。比如字符常量A,如果不加单引号,只是一个A,那么一定会被编译器认为成一个符号的名字比如变量名。又比如字符常量1,如果不加单引号,只是一个1,那么一定会被编译器认为成是一个整型常量1。因此,必须在所需要的字符周围加上一些称之为“界定符”的字符把它们包围起来,才能和其它数据进行区分。Q081既然单引号里只能有一个字符,为什么有的程序中会出现n,101这样的字符?(字符型)A081这是因为除了前面提到的“单引号括起来的一个字符”形式的字符常量,语言还存在另一种形式的特殊的字符常量,叫“转义字符常量”。它是用单引号括起来的以一个“”字符开头的规定的字符序列。比如问题当中提到的n,101。在转义字符常量中,单引号里面的确是不止一个字符,但实际上整个还是只代表一个字符,也是合法的字符常量。这也就是“转义”之含义。起到转义作用的是单引号当中的 “”,它被用来作为转义字符序列的起始字符。如果单引号中起始字符不是“”,又多于一个字符,那么就不是合法的字符常量了。比如,nn,101就不是合法的字符常量。Q082为什么要用到“转义字符常量”?(字符型)(转义字符常量)A082因为除了键盘上的所有字符外,程序当中还需要用到一些在键盘上找不到也就无法直接输入的特殊字符。这些字符往往代表了一些独特的特定的功能。因此需要用一种特殊的方法来表示它们,这就产生了“转义字符常量”,也叫“转义字符序列”。Q083C语言中都支持哪些“转义字符常量”?(字符型)A083C语言所支持的转义字符常量如可以分为三大类,如下表所示:Q084上表中出现的ASCII代码是什么意思?(字符型)(ASCII码)A084ASCII是英文American Standard Code for Information Interchange的缩写,其中文含义是“美国信息交换标准代码”。实际上,ASCII码是一个0255之间的整数。每一个整数对应着一个不同的字符,即每一个字符都有一个不同的整数代码。比如,上表中出现的字符n用整数10代表,而单引号本身是用整数39代表的。完整的ASCII码表请参见课本374页。Q085为什么每一个字符要用一个不同的整数来代表?(字符型)(ASCII码)A085根本原因在于计算机的基本原理是二进制的。字符型的数据本身是非数值型的,是无法保存在计算机当中的,因为计算机中所有的数据最终都要以二进制数的形式来保存。因此,就要设法将非数值型的数据转换为数值型的数据,从而产生了很多种称之为“字符集”的东西。在各种“字符集”中,把每一个字符用一个唯一的整数来代表。当程序运行时,在出现在该字符的地方实际内存中存储的是该字符对应的整数代码。ASCII就是一种扩充的西文字符集,它把常用的256个字符分别用0255之间的整数来代表。Q086那么说,C语言中的字符型数据实际上就相当于数值型的数据喽?(字符型)A086正是。每个字符型数据无论是常量还是变量在内存中只占一个字节,这个字节中实际保存的就是该字符的ASCII代码。而ASCII码是一个整数,就要按整数的存储方式来保存,因此在C语言中,字符型和整型数据的存储方式是一致的,不同的只是两者占据的字节单元数目。比如字符常量A,它的ASCII码是整数65,因此在内存中,字符常量A所占的一个字节中实际保存的是整数65,即01000001。反过来看,如果我只知道有一个字节中存放的是01000001,那么我们既可以说它是整数65,也可以说它是字符常量A。可见,在C语言中,字符型数据和整型数据在一定范围内是通用的,即两者可以相互赋值,相互输出,也可以在一起进行运算。Q087请举例说明字符型数据和整型数据在一定范围内是通用的? (字符型)A087程序如下:#include void main( ) char c1, c2, c3; c1 = A; c2 = b; c3 = ; /* c3保存的是字符空格,ASCII码是32 */ c1 = c1 + 32; /* 字符可以和整数进行算术运算 */ c2 = c2 - c3; /* 字符甚至还可以和字符进行算术运算 */ printf(c1 = %c, c1 = %dn, c1, c1); /* 输出结果时,字符既可以显示为字符(%c) */ printf(c2 = %c, c2 = %dn, c2, c2); /* 也可以显示整数(%d) */ return;实际上,无论是字符和整数的运算,还是字符和字符的运算,本质上都是整数之间的运算。因此上述程序的运行结果就是:c1 = a, c1 = 97c2 = B, c2 = 66Q088这么多字符的ASCII码,如何记住它们?(字符型)(ASCII码)A088根本不需要记住它们,因为你随时都可以查阅ASCII码表得到所需字符的ASCII码。但是,对其中最常用的一些字符,你只需记住它们在ASCII码表中出现的简单规律,就可以记住它们的ASCII码。常用字符及对应ASCII码如下表所示:仔细观察上表,发现规律没有?规律:字符0的ASCII码是48,字符0到字符9的ASCII码是连续的;规律:字符A的ASCII码是65,字符A到字符Z的ASCII码是连续的;规律:字符a的ASCII码是97,字符a到字符z的ASCII码是连续的;规律:对应大小写字母的ASCII码之差等于32。Q089为什么0- 0不等于0? (ASCII码)(字符常量)A089因为0是字符型的常量,它实际上相当于其ASCII码整数48,而0就是整数0,所以0-0实际上就是48-0,当然不会等于0,应该等于48。同样的道理也适用于1-1=48。Q090C语言在处理字符串常量时如何知道字符串在何处结束呢?(字符串常量)A090C的字符串常量是用双引号(“)括起来的若干个字符。比如:a、Hello, world、9811113、LCS等等。必须知道的是:字符串常量在内存中占用连续的字节单元,每个字符按顺序占一个字节。因此如果知道第一个字符所占字节单元的地址,就可以依次找到所有的字符。那么系统是如何判断字符串在何处结束呢?实际上,当程序中出现有字符串常量时,编译系统会自动的在其结尾处(即最后一个字符后面)加上一个特殊的字符用以标志字符串的长度。这个字符就叫“字符串结束标志字符”,系统据此判断字符串是否结束。因此,系统并不管字符串有多长,它只管记住第一个字符的地址,然后按顺序处理每一个字符直到发现“结束标志字符”为止。因此,的字符串常量在内存中占用的字节数等于可见字符数加上1,即结束标志字符占用的一个字节。比如,字符串常量HELLO实际占有6个字节的内存单元。Q091C语言是用哪一个字符作为“字符串结束标志字符”的?(字符串常量)A091这个特殊的结束标志字符就是ASCII码表中的第一个字符,也就是ASCII码为0的字符。我们通常用0来描述它。这个字符是一个“空操作字符”,就是说,它既不引起任何控制动作,也不产生任何显示,因此最适合作字符串结束标志字符。Q092A和A到底有什么区别?(字符串常量)(字符常量)A092A是字符常量,占一个字节单元,而A是字符串常量,虽然看上去只有一个字符,但由于C语言对每一个字符串常量均在其末尾自动添加一个字符串结束标志字符0,因此A实际占两个字节单元,分别保存字符A和0。其实,这只是两者的表面区别,其本质区别在于两者是根本不同的数据类型:A是字符型数据,而作为字符串常量的A在C语言中被处理成了字符指针类型。由于这个本质区别的存在,所以在任何时候都不能把一个字符串常量赋值给一个字符变量。比如 char c1 = A; 就是错误的。Q093为什么字符串常量(双引号中没有任何字符)要占一个字节单元?(字符串常量)A093道理从前。虽然双引号中没有一个字符,但由于C语言对每一个字符串常量均在其末尾自动添加一个字符串结束标志字符0,因此实际占一个字节单元,这个字节就用来保存字符串结束标志字符0。Q094用这样的语句给两个变量赋同样的初值正确吗?(变量初始化)int TotalScore = AverScore = 0; A094不正确。因为C语言规定(没有原因的)在一个语句中定义多个相同类型变量的同时对变量进行初始化时,不能用连续号的方式给它们赋同样的初值。正确的做法是一个一个变量赋初值,即int TotalScore = 0, AverScore = 0;Q095为什么在C语言中两个整数运算表达式的值一定是整数?(类型转换)A095这涉及到当C语言求解有混合类型数据运算的表达式时进行类型的自动转换的问题。C语言中,不同类型的数值型数据之间可以进行混合运算,即是说,各种整型数据、实型数据和字符型数据可以在一起构成表达式。如:10 % a + 1.5 / 123.45 * B 3。系统在求解这种包含混合类型数据运算的表达式时,首先要根据一定的转换规则把不同类型的数据转换成同一类型,然后才进行运算。这种类型转换过程是自动进行的(也叫隐式类型转换)。转换规则如右图所示:横向向左的箭头表示必定的转换。比如,char型数据必定先转换成int型,float型必定会转换成double型。纵向向上的箭头表示当有这些不同类型数据混合运算时才需要进行的转换。本问题的答案就在上面第个转换规则当中。第个转换规则所描述的言外之意就是当表达式中没有不同类型数据时就不存在隐式类型转换,而表达式的值也就是这个类型的。所以当有两个相同类型的整数构成一个表达式时,其值一定就是这个类型的整数,而决不会是其它阿类型。比如表达式 4 * 5 的值就是20,而表达式 5 / 4 的值就是1(整数),而不是1.25(实数)。Q096什么是运算符的优先级?(优先级)A096运算符的优先级并不决定整个表达式最终计算的顺序,它只决定和它相邻的运算量是否优先和它一起构成相应的表达式。比如表达式 13 + 2 * 5,数据 2 的两边是不同的运算符,那么它到底是先和5相乘呢,还是先和13相加呢?正因为乘法运算符 * 的优先级比加法运算符 + 的级别高,所以这个表达式实际上等价于 13 + ( 2 * 5 ),就是说 * 号把 2 先抓到了,而不是等价于 ( 13 + 2 ) * 5。一个表达式不管多么复杂,总可以按照各种运算符的优先级进行分解,分解过后就剩下级别最低的运算符了。Q097运算符的结合性又有什么作用?(结合性)A097运算符的结合性有两个作用:当某个运算量的两边是相同级别的运算符时,就按照结合性所规定的方向进行表达式的分解。比如表达式 1 + 2 + 3,由于加法运算符是左结合性,所以分解的结果就是 ( 1 + 2 ) + 3。当一个表达式按照运算符的优先级分解完毕后,剩下的一定是级别最低的运算符,就是说是这个级别最低的运算符所代表的表达式。结合性就指明了这个表达式的求解方向。Q098为什么我无法用C语言求解 5.4 % 3这样的表达式?(整型)(求余)A098那是因为C语言不允许非整型数据进行求余的运算。换句话说,参与求余运算的运算量必须是整型数据。Q099在A095中提到数据类型的自动转换或隐式转换,那么能不能在程序中不按照前面的规定进行自己需要的类型转换呢?(类型转换)A099可以。C语言提供有“强制类型转换运算符”可以实现数据到指定类型的转换。这个运算符的符号不固定,其形式是 (类型名) ,用法是 (类型名)待转换类型的数据。比如,(int)5.3,(float)3,分别表示把实数5.3临时转换为整型数据5,把整型数据3临时转换为实型数据3.0。对于强制类型转换,要注意的是:参与强制类型转换的数据本身的类型并没有也不会被改变,只是有一个临时空间来保存转换的结果去进行运算。Q100+i 和 i+ 到底有什么区别?(自增)(自减)(+)(-)A100+和-叫“加一”“减一”运算符,其作用是使变量的值加1或减1。但是这两个运算符和其它的单目运行符不同的是,它们既可以出现在运算量的前边,也可以出现在运算量的后边。对于表达式+i 和 i+,相同的是不管运算符前置还是后置,变量i的值都会加1,而区别就在于当运算符前置或后置时,所构成的自增自减表达式的值不同。具体的说:l 当运算符前置时:变量先加(减)1,然后才得到整个表达式的值就是变量加(减)1之后的值;l 当运算符后置时:先得到整个表达式的值是现在变量的值,然后变量才加(减)1。比如,当i = 5时,表达式 +i 的值等于6,而表达式 i+ 的值等于5,而i在表达式求解后都是等于6的。Q101为什么赋值表达式的左边只能是变量,不能是常量或表达式?(赋值表达式)A101赋值表达式在求解过程中会改变赋值运算符左边数据的值,而C语言中只有变量的值才可以在程序运行期间被改变,常量的值是不可能被改变的。至于表达式,根本不占据存储单元,怎么可能给它赋值呢?具有同样情况和原因的是自增、自减运算符。就是说,自增自减表达式的运算量也只能是变量,因为在自增自减表达式的求解过程中,实际上包含了给数据赋值的操作。Q102如何求解一个赋值表达式?(赋值表达式)A102由于赋值运算符是“右结合性”,所以赋值表达式的求解过程如下:先求解赋值运算符右边的表达式,再将该表达式的值赋值给左边的变量。最后,整个赋值表达式的值就等于被赋值后的左边变量的值。可见,求解赋值表达式值的过程中伴随着给变量赋值的作用。实际上,我们写一个赋值表达式,绝大多数时候的目的都是为了给一个变量赋值(这个目的是在系统求解赋值表达式的过程当中实现的),因此往往不关心最后求出的赋值表达式的值(就是说,不会去使用这个值)。比如下面两个语句:int a; a = 0; 第二个语句是由赋值表达式组成的。这个赋值表达式的值就是0,但是这个值并没有继续组成其它的表达式,所以这个语句的作用实际上就只是给a赋值为0。Q103什么是逗号表达式?(逗号表达式)A103这又是一个C语言中特有的运算符所构成的表达式。所谓逗号表达式,是指用逗号运算符把若干个原本独立的合法的C表达式连接起来形成的一个表达式。重要之处在于“一个表达式”。逗号运算符又称“顺序求解运算符”,即对于一个逗号表达式,其求解过程是:先从左到右依次求解用逗号连接的每个表达式,而整个逗号表达式的值就等于最后那个表达式的值。从上述求解逗号表达式的过程可以看出,为了求出整个逗号表达式的值,必须先依次求出逗号表达式中每个表达式的值,因此,写逗号表达式的目的往往不是为了整个表达式的值,而是利用求解逗号表达式的过程来求解其中每个表达式。比如有逗号表达式i=1,j=1,sum=0,为了求解出整个逗号表达式的值,必须一次求解i=1、j=1、sum=0三个赋值表达式,最后得到整个逗号表达式的值等于0。但是这个0又没有被使用,因为我们的目的在于给变量i、j、sum赋值。Q104为什么下面正确的只有(D)?(变量初始化)(A) char a = b = c = 0; (B) char a; b; c; (C) int x, char c; (D) int x, y, z = 0;A104(A)是错误的,因为C语言规定在一个语句中定义多个相同类型变量的同时对变量进行初始化时,不能用连续号的方式给它们赋同样的初值。(参见Q094)(B)是错误的,因为C语言规定在一个语句中定义多个相同类型变量时应该用逗号分隔。(C)是错误的,因为C语言规定在一个语句中只能定义一种类型的变量。第四章 顺序结构程序设计Q105C程序的结构是怎样的?(程序结构)A105一个C程序其结构如下图所示:对于大型的程序,通常不止一个源程序文件,所以要通过工程(project)来进行管理。每个源程序文件中按类别分别包含若干个函数,以及若干个全局变量和预处理命令。每个函数体里面是若干个局部变量的定义以及实现该函数功能的若干个语句。Q106C语言中都有哪些种类的语句?(语句)A106C语言中语句并没有严格的分类。按照功能可以大致作如下划分:1. 控制语句:9种,实现对程序流程的控制。所用到的关键字有 if else switch goto while for break continue return2. 表达式语句:任何合法的C表达式加上一个分号即成为一个语句 如:num = 1; num +; 3. 函数调用语句:任何合法的C函数调用加上一个分号即成为一个语句 如:printf(num = %dn, num);4. 空语句:只有一个分号不执行任何动作的语句5. 复合语句:用一对大括弧 把若干语句括起来就成为一个复合语句,又称为分程序。 如: int a = 1; a +; printf(a = %dn, a); 复合语句在语法上只是一个语句。Q107一个C程序中是如何实现输入输出功能的?(输入)(输出)A107为了使C语言更精简,C语言的发明者当初并没有设计能够完成输入输出功能的关键字,而是将这一部分功能转移出来并进行规划和扩充从而形成C语言的附加功能。即用 C标准库函数的形式来完成输入输出功能。比如printf函数用于输出,scanf函数用于输入,等等。不同版本的C语言(C编译器)均附带有不同数量不同用途的系统库函数,它们以 .obj 文件或 .lib 文件的形式提供,供用户与自己的 .obj 文件链接以形成 .exe 的可执行文件。但是,所有版本的C编译器必须都要提供由ANSI C规定的库函数,这些函数就称之为标准库函数。使用标准库函数编写程序无需担心可移植性的问题。Q108那么,如何在程序中使用这些库函数?(库函数)A108要想正确成功的调用C系统库函数,就必须在使用了该函数的源程序文件开头用预编译命令“#include”将有关的“头文件”包括进来。C语言中的头文件(header file)是指后缀名习惯为“.h”的一些文本文件。在头文件中,包含有关系统库函数的原型、有关系统全局变量的声明、有关系统符号常量的宏定义、有关数据类型的定义等等信息。其中,系统库函数的原型就告诉编译系统该函数的名称、返回值的类型、形参数量及类型等信息,这样编译系统才能正确编译,否则会给出出错信息。如:要想调用系统输出库函数printf和scanf,在源程序文件开头必须有如下预编译命令#include Q109如何使用格式输出函数printf?(printf)A109使用一个函数的关键在于掌握该函数的调用参数以及返回值。所谓函数的调用参数是指一个函数执行时所必须的输入信息,而函数的返回值是一个函数每次被调用后所得到的值。printf函数有两部分参数:1.格式控制字符串:通常是一个字符串常量,也可以是字符数组或字符指针。比如有printf(Twice %d is %d .n , num, 2*num);其中双引号括起来的Twice %d is %d .n就是这第一部分的参数。这部分参数中又包含着两类具有不同作用的字符。格式控制字符:由和规定的格式字符组成,比如上句中的两个%d。一个格式控制字符串中可以有一个或多个格式控制字符。其作用是把第二部分的输出项目列表中对应位置上的数据格式化成该格式字符所规定的数据类型。普通字符:除格式字符以外的所有其它字符。它们不起任何格式作用,只是简单地被printf函数原样输出到显示器上。通常用于说明输出数据或给用户有关的提示说明信息。2.输出数据列表:将要输出的数据,用逗号分隔。可以是常量,变量、函数调用或任何合法的C表达式。比如上句中的num和2*num。具体的printf的使用例子如下:printf(Twice

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论