欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 【0102】C语言(左值右值++,auto extern,类型转换整形提升,虚函数类继承类大小计算,数组指针++)

【0102】C语言(左值右值++,auto extern,类型转换整形提升,虚函数类继承类大小计算,数组指针++)

2025/2/25 11:20:06 来源:https://blog.csdn.net/vpurple_/article/details/144878615  浏览:    关键词:【0102】C语言(左值右值++,auto extern,类型转换整形提升,虚函数类继承类大小计算,数组指针++)


1.在下列表达式选项中,正确的是()

A ++(a++)

B a++b

C a+++b

D a++++b

C a+++b

A:a++操作通过临时常量返回其值,该值是一个常量(不是左值),因此不能被修改,后缀++需要对左值进行操作,所以会引起编译错误

B:D:无法划分有效的运算符

2函数的形式参数隐含的存储类型说明是()

A extern

B static

C register

D auto

D auto

函数的隐含储存类型是extern,函数的形参或变量的储存类型为auto

函数的隐含存储类型通常是 extern,即使你不显式地写出 extern,只要在不同的源文件中调用该函数,编译器也会假定该函数在其他地方定义。这是 C++ 的默认行为。

auto: 关键字用于自动推导类型。它允许编译器根据初始化表达式的类型自动推断变量或函数参数的类型,而无需显式地指定类型。

register  : 寄存器型变量:这个关键字要求编译器尽可能的将变量存储在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率

static  : 静态变量,程序在第一次给它赋值后,即使变量所在函数执行完,它也不会被释放,这就是静态变量,它的生命周期等同于整个程序的运行周期。

3.有定义int a=8, b=5, c;,执行语句c=a/b+0.4;后,c的值为( )

A 1.4

B 1

C 2.0

D 2

B 1

注意最后C类型是Int类型

a/b=1

1+0.4=1.4

int c=1

类型转换原则:根据当前运算符的操作数判断。 步骤:

  1. 整形提升:把小整形转为int以上的大整形。
  2. 算数转换:将两者中宽度(字节)较小的转换为宽度较大的一方。
  3. 符号转换:如果其中的无符号类型宽度大于等于带符号类型,则把带符号类型转为无符号类型;否则把无符号类型转为带符号类型。

4.在C语言中,定义一个返回值为指针的函数,以下函数定义错误的是()

A static char retarray[20]; char *func(int n) { sprint(retarray, ”%d”, n); return retarray; }

B char *func(int n,char *retarray) { sprint(retarray, ”%d”, n); return retarray; }

C char *func(int n) { char *retarray = malloc(20); if(retarray != NULL) sprint(retarray, ”%d”, n); return retarray; }

D char *func(int n) { char retarray[20]; sprint(retarray, ”%d”, n); return retarray; }

D

char retarray[20]是存在与函数栈空间的,函数结束栈空间销毁,return的是空指针

5.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

class t_classA {

public:

    t_classA() {};

    ~t_classA() {};

};

class t_classB {

public:

    t_classB() {};

    virtual ~t_classB() {};

};

class t_classC : public t_classA, public t_classB {

public:

    t_classC() {};

    virtual ~t_classC() {};

};

int nLenA = sizeof(t_classA);

t_classA oA;

int nLenAObject = sizeof(oA);

int nLenB = sizeof(t_classB);

t_classB oB;

int nLenBObject = sizeof(oB);

int nLenC = sizeof(t_classC);

t_classC oC;

int nLenCObject = sizeof(oC);

请问:nLenA、nLenAObject、nLenB、nLenBObject、nLenC、nLenCObject的值(32位机器)分别为()

分别为:1 1 4 4 4 4

 C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1,所以nLenA和nLenAObject的值为1; 

如果类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。因此,LenB和nLenBObject的值为4;

 对于普通继承,派生类和基类共享虚函数指派生类对象的存储空间=基类存储空间+派生类特有的非static数据成员的空间由于t_classA为空类,t_classB和t_classC共享虚函数指针,因此LenC和nLenCObject的值为4;

6.有以下定义和语句

1

2

int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];

p[0] = a[1];

则*(p[0]+1)所代表的数组元素是()

代表:a[1][1]

int a[3][2]={1,2,3,4,5,6}产生的结果是
a[0][0]=1,a[0][1]=2,a[1][0]=3,a[1][1]=4,a[2][0]=5,a[2][1]=6
根据数组的表示法,数组名可以指代数组整体,还可以指代数组头元素位置
也就是说a[0]就是表示1,2中的那个1的位置,a[1]就表示3,4中3的位置,类推a[2]指的是5的位置
*p[3]是声明一个整形指针的数组,也就是说是三个p,每个p都是指向整数的
p[0]=a[1]就是相当于p[0]=&a[1][0],也就是让p[0]指向3的位置
--------------------以上是题设的内容-----------------------
p[0]+1,因为p是一个int *的指针数组,它做+1操作就是移动一个int * 的解引用也就是int,就是跳过一个int整形,根据指针的用法,指针进行加减操作,就是让指针在内存中前后移动
那么p[0]原来指向3的位置,p[0]+1就是让指针后移,那么就是指到了4的位置上
而*(指针),表示的是指针所指位置上的实际变量,即*(4的位置)那么就是4了,也就是a[1][1

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词