牛客网错题记录 2019-3-26

1.int a=5;++(a++) 的值是多少?

  • 答案是错误,因为由于小括号,我们需要先计算小括号中的 a++ ,而 a++ 是表达式, ++ 不能对表达式进行,因此该表达式会出错。

2.子类型

  • 子类型必须是子类继承了父类的所有可继承特性,也即公有继承,才能说是子类型,否则就只是单纯的子类。

3.有以下程序,问 sizeof(B) 的值是多少?

class A
{
public:
    int fun1();
    virtual void fun2();
private:
    int _a1;
    static int _a2;
};

class B: public A
{
public:
    virtual void fun2();
};
  • 8。32位系统下,虚函数指针大小为4,类B继承自类A,因此有一个int型变量,因此类B的大小为8;64位系统下,虚函数指针大小为8,类B继承自类A,因此有一个int型变量,为了字节对齐,类B的大小为16。

4.C语言的标识符分为3类:关键字、预定义标识符和用户标识符。

5.算法具有五个重要的特征:

  • 1.有穷性:一个算法必须保证执行有限步之后结束;
  • 2.确切性: 算法的每一步骤必须有确切的定义;
  • 3.输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
  • 4.输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
  • 5.可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。

6.scanf不能指定输入精度,可以指定长度。

7.if语句后的一对原括号中,用以决定分支的流程的表达式 可以是任意表达式。

  • 因为任意表达式都可以等价为真或假,因此可以作为if的判断形式。

8.64位系统下,下列结构体的大小为?

struct T {
    char a;
    int *d;
    int b;
    int c:16;
    double e;
};
T *p;
  • 1.字节对齐的三个准则:
    • 1.1 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
    • 1.2 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
    • 1.3 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
  • 2.答案是32。在64位系统中,指针的大小为8个字节,因此 a 占1个字节,对齐 d 则 a 和 d 共占16个字节,b和c占8个字节,e占8个字节,一共是32个字节。

9.回调函数

  • 1.回调函数就是一个通过函数指针调用的函数;
  • 2.把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数;
  • 3.操作系统在运行过程中自行调用的函数就是回调函数。

10.在32位机器上,下列代码的结果是?

char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};     
short *pshort = (short *)array;     
int *pint = (int *)array;     
int64 *pint64 = (int64 *)array;     
printf("0x%x , 0x%x , 0x%llx , 0x%llx", *pshort , *(pshort+2) , *pint64 , *(pint+2));
  • 答案:0x201 , 0x605 , 0x807060504030201 , 0x0 。
  • 计算机默认是小端存储,高位字节放在高地址,低位字节放在低地址;
  • char一字节,直观呈现的结果为:0x08-07-06-05-04-03-02-01(从后到前下标为0-7);
  • short两字节,直观呈现的结果为:0x0807-0605-0403-0201(从后到前下标为0-3);pshort从0开始,所以0x201;(pshort+2)从2开始,所以0x605;
  • int64八字节,直观呈现的结果为:0x0807060504030201(从后到前下标为0);*pint64从0开始,所以0x807060504030201;
  • int四字节,直观呈现为0x08070605-04030201(从后到前下标为0-1);*(pint+2))从2开始,但是最多只到下标1,后面位置默认为0。

11.哪一个可以把一个32位变量的最高位置为1且保持其它位不变?

A.reg32|=1<<31
B.reg32&=1<<31
C.reg32&=~(1<<31)
D.reg32^=1<<31
  • 答案:A
  • 先不管reg32是什么东西,先看 1<<31 ,这个表达式是将 0000 0000 0000 0000 0000 0000 0000 0001 变为了 1000 0000 0000 0000 0000 0000 0000 0000 ,之后再与 reg32 进行位或操作,因此无论reg32是什么类型的变量,我们都可以将其最高位置为1,其余位不变。

猜你喜欢

转载自blog.csdn.net/weixin_42896619/article/details/88942130
今日推荐