C语言试题集十道(第三期)

1.下列函数定义中,有语法错误的是()

A:void fun(int x, int *y){*x *= *y;}
B:void fun(int *x, int y){*x += y;}
C:int * fun(int *x, int y){return x += y;}
D:void fun(int x, int *y){x *= *y;}

正确答案:A

2.一个C语言程序在一台32位机器上运行。程序中定义了三个变量x、y和z,其中x和z为int型,y为short型。当x=127,y=-9时,执行赋值语句z=x+y后,x、y和z的值分别是()

A:x=0000007FH,y=FFF9H,z=00000076H
B:x=0000007FH,y=FFF9H,z=FFFF0076H
C:x=0000007FH,y=FFF7H,z=FFFF0076H
D:x=0000007FH,y=FFF7H,z=00000076H

正确答案:D

解析:

机器当中存储数据的补码形式,便于加减法运算。
x的十六进制表示比较容易得出:0000007FH
y的值是-9,且是short类型,为16位,那么十六进制补码表示即:FFF7H
接下来x与y相加,那么y需要进行符号扩展,由于它是补码形式存在,
所以符号位移到32位最左边,且中间的数字需要补上1,因为现在是对负数补码进行符号扩展!就是:FFFFFFF7H
那么xy相加就是0000007FH与FFFFFFF7H相加,得出00000076H

3.若有以下说明和定义,则叙述正确的是()

1

2

typedef int *INTEGER;

INTEGER p,*q;

A:p是int型变量
B:p是基类型为int的指针变量
C:q是基类型为int的指针变量
D:程序中可用INTEGER代替int类型名

正确答案:B

解析:

进行类型定义以后,INTEGER其实就是基类型为int 的指针类型,然后由

INTEGER 米定义两个变量p和*q,则p是基类型为int型的一级指针变量,而q是基类型

为int型的二级指针变量。故正确答案是B。

4.下列程序的功能是什么。

main()
{ 
    long num=0;
    FILE *fp:
    if((fp=fopen("fname.dat","r"))==NULL)
    {
        printf("Can’t open the file!");
        exit(0):
     }
     while(!feof(fp))
     { 
        fgetc(fp);
        num++;
     }
     printf("num=%d\n",num);
     fclose(fp);
}

A:拷贝文件
B:统计文件的字符数
C:统计文件的单词数
D:统计文件的行数

正确答案:B

解析:

fgetc(fp), 文件指针 fp 指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。

feof(fp)  是判断这个是否到文件末尾 没到则为真  所以 !feof(fp) 就是 要是没到末尾就继续循环

5.下列程序的输出结果是:

#include <iostream>
using namespace std;
void f() {
    static int i = 15;
    i++;
    cout << "i=" << i << endl;
}
int main(void){
    for(int k = 0;k < 2;k++) 
        f();
}
A:i=16     i=15
B:i=15     i=17
C:i=16     i=17
D:i=15     i=16
E:i=15     i=18

正确答案:C

解析:

static 修饰的变量只初始化一次, 当下一次执行到这一条语句的时候,直接跳过

6.

设有如下的说明和定义

1

2

3

4

5

6

7

struct {

    int a;

    char *s;

} x, *p = &amp;

x;

x.a = 4;

x.s = "hello";

则以下叙述中正确的是()

A:(p++)->a与p++->a都是合语法的表达式,但二者不等价
B:语句 ++p->a; 的效果是使p增1
C:语句 ++p->a; 的效果是使成员a增1
D:语句 *p->s++; 等价于 (*p)->s++;

正确答案:C

解析:

A  (p++)->a与p++->a 抛开++的优先级低于->不说,首先是后置++,所以不管是否加()都是先执行p->a再执行++改变p的值。

 B   ++P->a 根据优先级先执行p->a,指向成员a的值,然后进行++操作,使得成员a增1

C    *P->S++;(*P)->S++   ->优先级大与* ,()大于->,所以加了括号就不等价了

7.

阅读下面代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class B

{

public:

   virtual void Fun(){}

};

class D: public B

{

public:

   void Fun(){}

};

D dd;

B* pb = &dd;

D* pd = &dd;

pb->Fun();

pd->Fun();

上述例程调用的Fun函数顺序为()

B::Fun, D::Fun
B::Fun, B::Fun
D::Fun, D::Fun
D::Fun, B::Fun
正确答案:C

解析:

本题考察两个知识点:

一、赋值兼容:

        1.子类对象可以赋值给父类对象

        2.子类对象可以初始化父类对象

        3.父类指针可以指向子类对象

        4.父类引用可以引用子类对象

二、子类重写父类

这两个知识点也就是解释多态的关键

本题中,根据兼容性原则:当父类指针(引用)指向子类对象时,子类对象退化成父类对象,只能访问父类中定义的成员

如果B对象没有virtual修饰的话,B* pb = &dd; dd就会退化为父类对象,pd就只能访问父类的成员B::Fun()。

但是又virtual修饰的话,就会展现多态行为,会根据实际指针指向的对象判断函数的调用。pb 和pd都指向子类对象,所以调用D::Fun()。

8.设字符型变量x的值是064,表达式“~ x ^ x << 2 & x”的值是()

A:0 333
B:333
C:0x333
D:020

正确答案:A

解析:

1. ~x 按位取反,结果为 11001011

2. x << 2 对x左移2位,结果为11010000

3. x << 2 & x 即第2步的结果与x做按位与操作,结果为 00010000

4. 最后第3步的结果与~x做异或运算,结果为11011011,即333。

9.

有以下程序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#include <stdio.h>

void fun(int *s) {

    static int j = 0;

    do {

        s[j] += s[j + 1];

    while (++j < 2);

}

main() {

    int i, a[10] = {1, 2, 3, 4, 5};

    for (i = 1; i < 3; i++)

        fun(a);

    for (i = 1; i < 5; i++)

        printf("%d", a[i]);

    printf("\n");

}

程序运行后的输出结果是?

A:34756
B:5745
C:5795
D:35745

正确答案:B

解析:

for( i = 1; i < 3; i + + )将调用两次fun(a)

第一次调用fun(a)时数组的前两个元素变位3、5,此时j=2;

第二次调用fun(a)时,虽然j=2已经不满足++j<2但还是要执行一次,数组第三个元素变为7

然后for循环下标从1开始,所以输出后4个元素。5745

10.

下⾯函数的功能是()

1

2

3

4

5

int fun (char *s) {

    char *p = s;

    while(*p++);

    return p-s-1;

}

A:计算字符串的位(bit)数
B:复制⼀个字符串
C:求字符串的长度
D:求字符串存放的位置

正确答案:C

今天学习结束,这一期很棒!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进步小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值