不是出错,而是自动取低位两个字节的内容。将该数减去整型数据类型的模,所以 65536-65536=0 答案:B 【例题3-12】若int类型数据占两个字节,则执行以下语句的输出为() printf("%d%uln”,kk) A.-1,-1B.-1,32767 C.-1,32768 D.-1.65535 解析:c语言中,负数在内存中是以补码形式存在的。k=-1在内存中的存储形式是111l lll11,当把k的值按“%d”格式(有符号整数)输出时为-1。按“%u”格式 (无符号整数)输出时为65535 谷案:D 补充:求负数的补码(以-7为例) (1)写出绝对值-7的二进制表示形式 0000000000000l11 (2)按位取反(即将0变为1,将1变为0)11111100 (3)末位加1即得到7在内存中的表示形式111l11101 【例题313】在下述输出语句的判定中,正确的是() int x=Ox123456L: printf("%x, %ld,x,y); A输出值为3456,14 B.非法赋值 C输出值不确定 D输出值为0x123456,0xe 解析:Long型数据0x123456L赋给int型变量ⅹ,系统自动对其进行类型转换,将数据 中低16位3456赋值给x舍弃高16位的0x0012。将0xe赋值给long型变量y,其值送 到y的低16位,因为0xe是正数,所以变量y的高16位补0。十六进制0xe的十进制 为14。故选项A是正确的。 答案:A 【例题3-14】下列程序的输出是 #include <stdio h> printf("%d, null) A.0B.变量无定义 解析:(1)要把此处的nul与c语言中预定义表标识符NULL区分开。NULL是在头 文件 stdio. h中定义的的标识符,它代表“0’:而null是小写拼音字母拼写,因此不能 将它当做NULL,而是一般的用户标识符。 (2)c语言规定,程序中用到的所有变量在使用前必须先进行定义,而本题中的程序 在对nul做输出处理之前对它没有给出明确的变量定义 答案:B
16 不是出错,而是自动取低位两个字节的内容。将该数减去整型数据类型的模,所以 65536-65536=0 答案:B 【例题 3-12】若 int 类型数据占两个字节,则执行以下语句的输出为() int k=-1; printf(“%d,%u\n”,k,k); A. –1,-1 B.-1,32767 C.-1,32768 D.-1,65535 解析:c 语言中,负数在内存中是以补码形式存在的。k=-1 在内存中的存储形式是 1111 1111 1111 1111,当把 k 的值按“%d”格式(有符号整数)输出时为-1。按“%u”格式 (无符号整数)输出时为 65535。 答案:D 补充:求负数的补码(以-7 为例) (1)写出绝对值|-7|的二进制表示形式 0000 0000 0000 0111 (2)按位取反(即将 0 变为 1,将 1 变为 0) 1111 1111 1111 1000 (3)末位加 1 即得到-7 在内存中的表示形式 1111 1111 1111 1001 【例题 3-13】在下述输出语句的判定中,正确的是() int x=0x123456L; long int y=0xe; printf(“%x,%ld”,x,y); A.输出值为 3456,14 B.非法赋值 C.输出值不确定 D.输出值为 0x123456,0xe 解析:Long 型数据 0x123456L 赋给 int 型变量 x,系统自动对其进行类型转换,将数据 中低 16 位 3456 赋值给 x,舍弃高 16 位的 0x0012。将 0xe 赋值给 long 型变量 y,其值送 到 y 的低 16 位,因为 0xe 是正数,所以变量 y 的高 16 位补 0。十六进制 0xe 的十进制 为 14。故选项 A 是正确的。 答案:A 【例题 3-14】下列程序的输出是 #include <stdio.h> main( ) { printf(“%d”,null);} A. 0 B. 变量无定义 C. –1 D. 1 解析:(1)要把此处的 null 与 c 语言中预定义表标识符 NULL 区分开。NULL 是在头 文件 stdio.h 中定义的的标识符,它代表‘\0’;而 null 是小写拼音字母拼写,因此不能 将它当做 NULL,而是一般的用户标识符。 (2)c 语言规定,程序中用到的所有变量在使用前必须先进行定义,而本题中的程序 在对 null 做输出处理之前对它没有给出明确的变量定义 答案:B
【例题3-15】若k为整形变量,则以下语句 printf("%dn”a) A.赋值不合法 B.输出值为-2C.输出为不确定值D输出值为2 解析:本题的主要关键是要弄清c语言中常量的表示方法和有关的赋值原则。在一个 整形常量后面加一个L则被认为是长整形常量。一个整常量,如果其值在-32768-32767 之间内,可以赋给一个int型或 long int型变量。但如果整常量的值超过了上述范围, 而在2147483648--2147483674范围内,则应将其值赋给一个 long int型变量。本例中2L 虽然为 long int但是其值为-2,因此可以通过类型转换把长整形转换为短整形,然后赋 给整形变量a,并按照%d格式输出该值即为-2。 谷案:B 【例题3-16】在c语言中,若下面的变量都是int类型的,则输出的结果是 PAD=sum++ PAD++++PAD printf("%dn”,pad) B.6 D.4 解析:在c语言中,标识符的大小写含义是不同的,因而本题中的pad和PAD分别代 表两个不同的变量名称。由于pad已赋值为5,所以显示pad的结果也是5。 答案:C 【例题3-17】己知ch是字符变量,以下不正确的赋值语句是() A.ch=“a Bch=a’;C.ch=4l’;D.ch=lx61'+3 解析:a'是字符占用一个字节。“a”是字符串占用两个字节,不能赋值给字符型变量,因 为字符型变量只能存放一个字节的内容。所以A应该是错误的。C选项和D选项是转义 字符分别用八进制和十六进制的ASCI码表示字符常量‘a'’和‘d'。 答案:A 【例题3-18】下面选项中,()是对字符变量不正确的赋值方式 B.ch=7+3 解析:A选项是将字符$赋给字符变量。选项B是数字字符7与整数3相加做算术运算。 C语言中字符型数据和整形数据间可以通用,一个字符型数据既可以按字符型数据处理 也可以按整形数据处理。按整形数据处理时将ASCI值作为整数处理,故字符数据可 以进行算术运算。选项c为转义字符。选项D单引号括起来三个字符。而字符常量是 单引号括起来的一个字符,字符型变量用来存放一个字符型常量,且只能放一个字符 故选项D为错误。 答案:D 【例题3-19】若有以下定义和语句 char cl=b, c2='e printf("%d, %cIn, c2-cl, c2-a+A); 则输出结果是
17 【例题 3-15】若 k 为整形变量,则以下语句 int a=-2L; printf(“%d\n”,a); A. 赋值不合法 B. 输出值为-2 C. 输出为不确定值 D.输出值为 2 解析:本题的主要关键是要弄清 c 语言 中常量的表示方法和有关的赋值原则。在一个 整形常量后面加一个 L 则被认为是长整形常量。一个整常量,如果其值在-32768-32767 之间内,可以赋给一个 int 型或 long int 型变量。但如果整常量的值超过了上述范围, 而在-2147483648---2147483674 范围内,则应将其值赋给一个 long int 型变量。本例中-2L 虽然为 long int 但是其值为-2,因此可以通过类型转换把长整形转换为短整形,然后赋 给整形变量 a,并按照%d 格式输出该值即为-2。 答案:B 【例题 3-16】在 c 语言中,若下面的变量都是 int 类型 的,则输出的结果是 sum=pad=5; PAD=sum++,PAD++, ++PAD; printf(“%d\n”,pad); A. 7 B. 6 C. 5 D. 4 解析:在 c 语言中,标识符的大小写含义是不同的,因而本题中的 pad 和 PAD 分别代 表两个不同的变量名称。由于 pad 已赋值为 5,所以显示 pad 的结果也是 5。 答案:C 【例题 3-17】已知 ch 是字符变量,以下不正确的赋值语句是() A. ch=“a”; B. ch=’a’; C. ch=’\141’; D. ch=’\x61’+3; 解析:‘a’是字符占用一个字节。“a”是字符串占用两个字节,不能赋值给字符型变量,因 为字符型变量只能存放一个字节的内容。所以 A 应该是错误的。C 选项和 D 选项是转义 字符分别用八进制和十六进制的 ASCII 码表示字符常量‘a’和‘d’。 答案:A 【例题 3-18】下面选项中,()是对字符变量不正确的赋值方式 A.ch=’$’ B.ch=’7’+3 C.ch=‘\t’ D.ch=‘a+b’ 解析:A 选项是将字符$赋给字符变量。选项 B 是数字字符 7 与整数 3 相加做算术运算。 C 语言中字符型数据和整形数据间可以通用,一个字符型数据既可以按字符型数据处理 也可以按整形数据处理。按整形数据处理时将 ASCII 值作为整数处理,故字符数据可 以进行算术运算。选项 c 为转义字符。选项 D 单引号括起来三个字符。而字符常量是 单引号括起来的一个字符,字符型变量用来存放一个字符型常量,且只能放一个字符。 故选项 D 为错误。 答案:D 【例题 3-19】若有以下定义和语句 char c1=’b’,c2=’e’; printf(“%d,%c\n”,c2-c1,c2-‘a’+’A’); 则输出结果是
A.2,M B.3,EC.2,eD.输出项与对应的格式控制不一致,输 出结果不稳定 解析:c语言中规定,字符型常量在内存中占一个字节,用于存放字符的ASCI值。所 有字符型常量都作为整形量处理,其对应的整数值就是 ASCIL字符集中该字符的序号 执行表达式“c2-c1”相当于字符‘e与字符“b’的 ASCII码值相减,即101-98得 而“c2-a'+'A”即101-97+65得69,而 ASCII码值69对应的字符是‘E’。 谷案:B 【例题3-20】请选出合法的c语言赋值语句 A.a=b==58B.i++;C.a=58,b=58D.k=int(a+b) 解析:由于c语言规定,c程序中的任一语句都必须有一个分号做结束标志,分号是 构成任何语句的重要成分,所以答案A、C均错。答案D中的书写int(a+b)是完全错 误的,根据c语言规定,使用强制类型转换运算符的书写形式为:(类型名)(表达式) 所以答案D应改写为:k=(n(a+b)。答案B当于语句i=计1;由此可见,该语句是合 法的赋值语句。 答案:B 【例题321】已知:‘a’的ASCⅡ码值为97,‘0’的ASCⅡ码值为48,下述程序的输 出结果是 #include<stdio h> maino printf("%s", tabc%LIT1064 11085); 3 A.口口口口口口口口abc%L4AB.tabc%L\064x411085 C.abc%L”0A abC%L"OA\085 解析:(1)转义字符“t”的作用是使后面的输出跳到下一个输出区。一个输出区为8 列。(2)abc为三个普通字符,原样输出。(3)对应“'V”的输出是单撇号和双撇号, (4)“%”后面不是格式字符,它作为普通字符输出,即输出一个“%”“L”是普通 字符,原样输出。(5)转义字符的ASCI码表示一个字符,八进制的转义字符“064” 为八进制,转换为十进制为52,表示字符4。十六进制的“ⅸ41表示字符‘A’。(6) “085”不是八进制的ASCⅡ码表示的一个字符,而是“10’、‘8’‘5’字符,输出 时输出到第一个空字符“0’时结束,所以,‘8’、‘5’不输出 谷案:A 【例题3-22】下列语句中,符合c语言语法的赋值语句是 A.a=7+b+c=atc;B.a=7+b++=a+7;C.a=7+b,b+,a++D.a=7+b,c=a+7 解析:答案A和B均错,c语言中的赋值运算符的左边只能是变量或表示一个存储单 元的表达式。答案c错,c语言中规定任何语句都必须有一个分号来结束。答案D正 确,c语言允许用逗号运算符把若干个表达式连接起来形成逗号表达式。 答案:D 【例题3-23】经过下述赋值后,变量x的数据类型是() int x=3; doubley: y=(double)x
18 A.2,M B.3,E C.2,e D.输出项与对应的格式控制不一致,输 出结果不稳定 解析:c 语言中规定,字符型常量在内存中占一个字节,用于存放字符的 ASCII 值。所 有字符型常量都作为整形量处理,其对应的整数值就是 ASCII 字符集中该字符的序号。 执行表达式“c2-c1”相当于字符‘e’与字符‘b’的 ASCII 码值相减,即 101-98 得 3。 而“c2-‘a’+’A’”即 101-97+65 得 69,而 ASCII 码值 69 对应的字符是‘E’。 答案:B 【例题 3-20】请选出合法的 c 语言赋值语句 A.a=b==58 B.i++; C.a=58,b=58 D.k=int(a+b); 解析:由于 c 语言规定,c 程序中的任一语句都必须有一个分号做结束标志,分号是 构成任何语句的重要成分,所以答案 A、C 均错。答案 D 中的书写 int(a+b)是完全错 误的,根据 c 语言规定,使用强制类型转换运算符的书写形式为:(类型名)(表达式), 所以答案 D 应改写为:k=(int)(a+b)。答案 B 当于语句 i=i+1;由此可见,该语句是合 法的赋值语句。 答案:B 【例题 3-21】已知:‘a’的 ASCⅡ码值为 97,‘0’的 ASCⅡ码值为 48,下述程序的输 出结果是 #include<stdio.h> main() {printf(“%s”,”\tabc%L\’\”\064\x41\085”);} A.□□□□□□□□abc%L’”4A B.\tabc%L\’\”\064\x41\085 C.abc%L’”0A D. abc%L’”0A\085 解析:(1)转义字符“\t”的作用是使后面的输出跳到下一个输出区。一个输出区为 8 列。(2)abc 为三个普通字符,原样输出。(3)对应“\’ \”” 的输出是单撇号和双撇号。 (4)“%”后面不是格式字符, 它作为普通字符输出,即输出一个“%”。“L”是普通 字符,原样输出。(5)转义字符的 ASCII 码表示一个字符,,八进制的转义字符“\064” 为八进制,转换为十进制为 52,表示字符’4’。十六进制的“\x41”表示字符‘A’。(6) “\085”不是八进制的 ASCII 码表示的一个字符,而是‘\0’、‘8’、 ‘5’字符,输出 时输出到第一个空字符‘\0’时结束,所以,‘8’、 ‘5’不输出。 答案:A 【例题 3-22】下列语句中,符合 c 语言语法的赋值语句是 A.a=7+b+c=a+c; B.a=7+b++=a+7; C. a=7+b,b++,a++ D.a=7+b,c=a+7; 解析:答案 A 和 B 均错,c 语言中的赋值运算符的左边只能是变量或表示一个存储单 元的表达式。答案 c 错,c 语言中规定任何语句都必须有一个分号来结束。答案 D 正 确,c 语言允许用逗号运算符把若干个表达式连接起来形成逗号表达式。 答案:D 【例题 3-23】经过下述赋值后,变量 x 的数据类型是() int x=3; double y; y=(double)x;
A int B char C float D double 解析:将变量x的值3强制转换成 double类型,再赋值给y,变量x的数据类型还是int 型。因为任何变量定义后其数据类型不能改变。 谷案 【例题3-24】以下程序的输出结果() x=3.6 F=(int) x; printf("x=%f, i=%d, x, i) A.x=3.600000.i=4B.x=3.i=3C.x=3.600000.i=3D.x=3i=3.600000 解析:变量被作强制类型转换后,其类型不会改变,改变的只有表达式的值,因此,执 行语句i(int)x后,x的值仍为36,但i的值为 答案:C 【例题325】设x=25,a=7y=4.7,算术表达式x+a%3*intx+y)%2/4的值 C.4.7 D.2.25 解析:取模运算只能在整形数据之间进行,a为整形变量。因为%、*、/这三个运算符 的优先级别相同,类型转换符优先于*、/运算符,a的值为7,7%3=1,又因为(int) (2.5+47)=7,1*7=7,7%2=1,1/4=0,所以表达式x+a%3(int)(x+y)%2/4=x+0=2.5 谷案:A 【例题3-26】下述程序的输出结果 maino inta-016;a%=6-1; printf("%od,, a) printf(%d”a++), printf("%,,++a); A4.0.3 B4,0,2 C.4,2,4 D.4.1.3 解析:(1)016是八进制整形常量,十进制表示为14。复合的赋值运算符的优先级别比 算术运算符“-”的优先级别低,先计算6-1=5,在计算a‰5(即14%5得4)赋值给a, 所以a的值是4,先输出4。 (2)计算a/=3(即4/3等于1,赋值给a,a的值为1)。计算a*=1(a*1等于1*1,赋 值给a,a的值为1),计算a+=1(a+1等于1+1=2,赋值给a,a的值为2)。 (3)执行 printf(“%d,”",a+);语句,先输出a的值为2,然后,变量a的值在自增1 (a的值为3)。 (4)执行 printf(“%od,”",+a);语句,先将变量a的值自增1(a的值为4),再输出 a的值4
19 A.int B.char C.float D.double 解析:将变量 x 的值 3 强制转换成 double 类型,再赋值给 y,变量 x 的数据类型还是 int 型。因为任何变量定义后其数据类型不能改变。 答案:A 【例题 3-24】以下程序的输出结果( ) main( ) {float x=3.6; int i; i=(int)x; printf(“x=%f,i=%d”,x,i); } A.x=3.600000,i=4 B. x=3, i=3 C. x=3.600000,i=3 D. x=3 i=3.600000 解析:变量被作强制类型转换后,其类型不会改变,改变的只有表达式的值,因此,执 行语句 i=(int )x 后,x 的值仍为 3.6 ,但 i 的值为 3。 答案:C 【例题 3-25】设 x=2.5,a=7,y=4.7,算术表达式 x+a%3*(int)(x+y)%2/4 的值 A.2.5 B.7 C.4.7 D.2.25 解析:取模运算只能在整形数据之间进行,a 为整形变量。因为%、*、/这三个运算符 的优先级别相同,类型转换符优先于*、/运算符,a 的值为 7,7%3=1,又因为(int) (2.5+4.7)=7,1*7=7,7%2=1,1/4=0,所以表达式 x+a%3*(int)(x+y)%2/4=x+0=2.5 答案:A 【例题 3-26】下述程序的输出结果 main() {int a=016;a%=6-1; printf(“%d,”,a); a+=a*=a/=3; printf(“%d,”,a++); printf(“%d”,++a);} A.4,0,3 B.4,0,2 C. 4,2,4 D. 4,1,3 解析:(1)016 是八进制整形常量,十进制表示为 14。复合的赋值运算符的优先级别比 算术运算符“-”的优先级别低,先计算 6-1=5,在计算 a%5(即 14%5 得 4)赋值给 a, 所以 a 的值是 4,先输出 4。 (2)计算 a/=3(即 4/3 等于 1,赋值给 a,a 的值为 1)。计算 a*=1(a*1 等于 1*1,赋 值给 a,a 的值为 1),计算 a+=1(a+1 等于 1+1=2,赋值给 a,a 的值为 2)。 (3)执行 printf(“%d,”,a++);语句,先输出 a 的值为 2,然后,变量 a 的值在自增 1 (a 的值为 3)。 (4)执行 printf(“%d,”,++a);语句,先将变量 a 的值自增 1(a 的值为 4),再输出 a 的值 4
谷案:C 【例题3-27】以下程序的输出结果是() main() {inta=1,b=2,c=3,k; k=a+++b+++c printf("\n%d, %d, %d, %d", a, b, c, k): 3 A.1,2,3,6B.2,34,6C.1,3,3,7 D.1,3,3,6 解析:表达式a+++b++c++应理解为:(a++)+(b++)+(c+)所以执行此语句后 k的值是6,a的值是2,b的值是3,c的值是4,输出结果为:2,3,4,6 答案:B 【例题3-28】下面正确的语句是() A.intx=y=25,B.ntz=(x+y)++;C.x=+8==7,D.x%=4.5; 解析:在c语言中,可以在定义变量时对变量初始化,例如:intx=25,但是,对几个 变量赋同一初值时不允许以A方式定义变量或对变量初始化。选项B中++运算符只能 用于变量不能用于常量或表达式,在本题中不能用于表达式(x+y)。选项D中,%运 算符的操作是只能是整形数据,不能是4.5。选项c中的运算符“=“比”=“的优先 级高,先进行”+8-=7“的运算,其值为假(0),再赋值给ⅹ,选项c是正确的赋值语 句。况且排除A、B、D只有C选项是正确的 答案:C 【例题329】若x,y都是整形变量,x=100,y=200,执行完 printf(%d"(xy),后,输 出结果是 A.200B.100C.100200D.输出格式不符,输出不确定的值 解析:c语言将逗号作为一种特殊的运算符,其求值过程是分别求两个表达式的值,并 以表达式2的值作为整个逗号表达式的值。 答案:A 【例题3-30】若有说明语句 Int 1,,则计算表达式i=(=3,+j=5j+5)后i的值为 B.4 C D.10 解析:求逗号表达式的过程是:先求表达式1的值,再求表达式2的值,最后求表达式 n的值,整个逗号表达式的值等于表达n的值) 谷案:D 【例题331】下述程序运行的结果是 main() fint x,y sizeof 3 145: = sizeof(3.14*5); printf("%d%dn”,xy);} C.8.8D.20.8 解析: sizef运算符的优先级高于算术运算符的优先级,所以 sizeof3.14*5相当于( sizeof
20 答案:C 【例题 3-27】以下程序的输出结果是() main( ) {int a=1,b=2,c=3,k; k=a+++b+++c++; printf(“\n%d,%d,%d,%d”,a,b,c,k);} A.1,2,3,6 B.2,3,4,6 C.1,3,3,7 D.1,3,3,6 解析:表达式 a+++b+++c++应理解为:(a++)+(b++)+(c++)所以执行此语句后, k 的值是 6,a 的值是 2,b 的值是 3,c 的值是 4,输出结果为:2,3,4,6。 答案:B 【例题 3-28】下面正确的语句是() A. int x=y=25; B.int z=(x+y)++; C. x=+8= =7; D.x % =4.5; 解析:在 c 语言中,可以在定义变量时对变量初始化,例如:int x=25,但是,对几个 变量赋同一初值时不允许以 A 方式定义变量或对变量初始化。选项 B 中++运算符只能 用于变量不能用于常量或表达式,在本题中不能用于表达式(x+y)。选项 D 中,%运 算符的操作是只能是整形数据,不能是 4.5。选项 c 中的运算符“==“比”=“的优先 级高,先进行”+8==7“的运算,其值为假(0),再赋值给 x,选项 c 是正确的赋值语 句。况且排除 A、B、D 只有 C 选项是正确的。 答案:C 【例题 3-29】若 x,y 都是整形变量,x=100,y=200,执行完 printf(“%d”,(x,y));后,输 出结果是 A.200 B.100 C.100 200 D. 输出格式不符,输出不确定的值 解析:c 语言将逗号作为一种特殊的运算符,其求值过程是分别求两个表达式的值,并 以表达式 2 的值作为整个逗号表达式的值。 答案:A 【例题 3-30】若有说明语句 int i,j; 则计算表达式 i=(j=3,j++,j=5,j+5)后 i 的值为 A.3 B.4 C.5 D.10 解析:求逗号表达式的过程是:先求表达式 1 的值,再求表达式 2 的值,最后求表达式 n 的值,整个逗号表达式的值等于表达 n 的值) 答案:D 【例题 3-31】下述程序运行的结果是: main( ) {int x,y; x=sizeof 3.14*5; y=sizeof(3.14*5); printf(“%d,%d\n”,x,y);} A. 15,4 B. 40,8 C. 8,8 D. 20,8 解析:sizef 运算符的优先级高于算术运算符的优先级,所以 sizeof 3.14*5 相当于(sizeof