C语言概念题解答选编

2026/1/27 3:52:09

① #define SQR(x) x*x ② #define SQR(x) (x)*(x) ③ #define SQR(x) (x*x) ④ #define SQR(x) ((x)*(x))

【解】宏调用是字符列的替换,一个宏调用被替换后,替换后的字符序列就与它前后的字符列一起构成新的源程序。常有这样的情况,因宏定义对宏参数的独立性注意不够,替换后的字符列会与其前后字符列结合,产生意想不多的结果;另外,因宏调用本身独立性注意不够,宏展开的内容会被分裂,部分内容会与其前或后的其它部分先结合。如一个宏定义有可能发生上述情况,它就是一个有可能引起二义性的宏定义。对于①,若希望描述计算u+v的平方,用宏调用SQR(u+v),产生的代码将是u+v*u+v。这是因宏定义对参数的独立性注意不够,产生不是希望的展开代码。对于②,若希望描述计算1.0/x2,用宏调用1.0/SQR(x),产生的代码将是1.0/(x)*(x),这是因宏调用本身独立性注意不够而引起的。对于③,与①的情况一样,宏调用SQR(u+v),不能正确描述u+v的平方。对于④,在宏定义中,给参数x加上括号能保证参数的独立性,定义给全部内容也加上括号,这也保证了整个宏调用的独立性。所以,④是计算平方数时,不可能引起二义性的宏定义。所以解答为④。

80.执行下列程序

#define M(a, b) (a) > (b)?(a):(b) main()

{ int i = 10, j = 15; printf(\后输出的结果是

① 10 ② 15 ③ 100 ④ 150

【解】上述程序输出表达式10*M(i, j)的值,该表达式中有宏调用,宏展开后的表达式为

10 *(i)> (j) ? (i) : (j)

该表达式是一个条件表达式,它的求值顺序如下:先求10 *(i)>(j),因变量i和j的值分别为10和15,10*10大于15,结

- 37 -

果为1。因条件表达式中的条件子表达式为1,以表达式(i)的结果为条件表达式的值。(i)的值是10,条件表达式的结果亦为10。最后,程序输出10。所以解答为①。

81.设有定义语句\{ int x; int y; } d[2] = {{1, 3}, {2, 7}};\,则

printf(\的输出是○。

① 0 ② 1 ③ 3 ④ 6 【解】结构数组d有两个结构元素,每个结构又由两个整型成分组成,初始化后,d[0].x = 1,d[0].y = 3, d[1].x = 2。所以表达式d[0].y /d[0].x*d[1].x的值是6。所以正确解答是④。

82.设有定义语句\his+10};\,则

printf(\的输出是○。

① 0, 1, 2, 3 ② 0, 4, 0, 10 ③ 0, 4, 5, 15 ④ 1, 4, 5, 15

【解】按枚举类型定义的规定,枚举类型team的枚举常量对应的整数分别是my=0、your=4、his=5、her=15。所以语句输出0,4,5,15。解答是③。

83.以下对枚举类型名的定义中,正确的是○。 ① enum a = {one, two, three}; ② enum a {a1, a2, a3};

③ enum a = {'1', '2', '3'};

④ enum a {\【解】枚举类型定义的句法是

enum 枚举类型名{枚举类型常量1,枚举类型常量2,……};

- 38 -

其中枚举常量都是互不相同的标识符。所以定义 enum a {a1, a2, a3}; 是一个正确的定义。任何在枚举类型名之后接上=、或用字符常量、或用字符串常量作为枚举常量都是不正确的定义。解答是②。

84. 若有如下定义,则printf(\sizeof(them));的输出是○。

typedef union {long x[2]; int y[4]; char z[8]; } MYTYPE; MYTYPE them;

① 32 ② 16 ③ 8 ④ 24

【解】共用型变量的成分是覆盖存储,为共用型变量分配存储时,以其中需要最多存储字节的成分进行分配。设long型数据占4个字节、int型数据占2个字节。共用型MYTYPE有三个成分,第一个成分是有两个long型元素的数组,它需要8个字节;第二个成分是有4个int型元素的数组,它也需要8个字节;第三个成分是有8个字符元素的数组,也是8个字节。所以MYTYPE类型的共用型变量只需要8个字节。正确解答是③。

85. 设有以下说明和定义:

typedef union {long i; int k[5]; char c;} DATE;

struct date { int cat; DATE cow; double dog; } too; DATE max;

则下列语句的执行结果是○。

printf(\ ① 26 ② 30 ③ 18 ④ 8

【解】设long型数据占4个字节、int型数据占2个字节,double数据占8个字节。共用型DATE有三个成分:long型成分i,有五个int型元素的数组k,char型成分c。所以DATE类型的变量需要10个字节。结构类型date有三个成分:int型成分 cat ,DATE共用类型cow,double型成分dog。所以结构类型date需要20个

- 39 -

字节。所以表达式sizeof(struct date)+sixeof max的值是30。正确解答是②。

86. 根据下面的定义,能打印出字母M的语句是○。 struct person {char name[9]; int age; }; struct person c[10]={{\

{\① printf(\② printf(\③ printf(\④ printf(\【解】结构类型struct person有两个成分:九个元素的字符数组name和一个基本整型age。元素类型为struct person的数组c有10个元素,其中前四个元素被设定了初值。在已设定初值的元素中,只有c[2].mane[0]的值是字符M。其余元素及元素的成分都不是字符M。解答是④。

87. 设有如下定义,则对data中的a成员的正确引用是○。 struct sk {int a; float b; } data, *p = &data;

① (*p).data.a ② (*p).a ③ p->data.a ④ p.data.a 【解】结构变量data有两个成分a和b。结构指针变量p指向结构变量data。引用结构变量data的成分a有两种方法:一是直接由变量data引用其自己的成分a,写成data.a。二是通过指针变量p引用它所指的结构的成分a。这又有两种写法,分别是p->a和(*p).a。解答是②。

88. 设有如下定义,则对pp中的name成员的正确输入是○。 struct s {char *name; int no; } pp; ① scanf(\

- 40 -


C语言概念题解答选编.doc 将本文的Word文档下载到电脑
搜索更多关于: C语言概念题解答选编 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219