c语言中 x4=0xAB是否正确,C语言基础类错题

在c++中,

输出是多少?

0,1

1,1

1,0

0,0

如果将i更改为volatile const int类型的,编译器就不会对变量i做优化,printf输出的结果就为1。

下面描述正确的是

p1和p2申请的空间里面的值都是随机值

p1和p2申请的空间里的值都已经初始化

p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化

p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值

下面说法正确的是:

(a>0 )&&(b>0)为真

c==a 为真

b的16进制为0xffffffe0

都不对

a-------1110 0000-----因为是有符号数,负数-----取反+1  0010 0000----- -32

b-------高位按符号位补齐-------ff ff ff e0

c-------224

x

y

t

均为

int

型变量,则执行语句:

t=3; x=y=2; t=x++||++y;

后,变量

t

y

的值分别为

____

1,2

||返回0或者1

在一个64位的操作系统中定义如下结构体:

同时定义fool函数如下:

上述fool()程序的执行结果为()

1,0,0

1,1,0

0,1,1

0,0,1

考点:字节对齐,低地址到高地址

因为字节对齐的原因,所以id占用4个字节,value和timestamp分别是4个字节、8个字节。虽然id占用四个字节的地址,但是只有低两位地址的数值有效(字节对齐的机制,即value存储时的地址对4(自身对齐值)求余应为0)。所以id为 0001 0001,高四位无效,所以为0001,value与timestamp分别为0.

比如:地址从0x0000开始,id存储地址本来为0x0000-0x0001,但value存储地址要从0x0004开始,因为0x0004%4==0,所以id存储地址为0x0000-0x0003, value存储地址为0x0004-0x0007, timestamp存储地址为0x0008-0x000F. 所以id == 0x00010001,去掉高4位,id=0x0001,其余为0.

经验:1、表示为习惯意义上的从高向低位写   高---》低    0010=2

2、小端机从右向左读,读的时候   元素间的字节外从右向左    元素内的字节内还是从左向右

nt main()

{

long long a=1;

long long b=2;

long long c=3;

printf("%d,%d,%d",a,b ,c);

return 0;

}

输出结果是什么?(32位环境,cpu为小端模式,所有参数用栈传递)

1、printf从右向左,压栈顺序c,b,a,栈从高向低,c在高位。

2、我们先表示为平常理解的方式高-->低,例如:1001   正常大端机器上:

【00 00 00 00 00 00 00 03】【00 00 00 00 00 00 00 02】【00 00 00 00 00 00 00 01】

大端机器读取,从左向右,%d为4字节,读取为0,3,0

小端机相当于从右向左读取,每次读取4个字节,1,0,2

unsigned int a= 0x1234;

unsigned char b=*(unsigned char *)&a;

在32位大端模式处理器上变量b= ?。

高--->低     00 00 12 34   大端机从左向右读取1个字节 00

x86

的机器上,

int a=0xabcd1234 char b=

((

char*

)

&a

)

[0]

请问

b

是多少0x34

高向低   ab  cd 12  34

X86小端机、1字节

在小端序的机器中,如果

如果:

X a;

a.x=0x11223344;//16 进制 则:______

a.y[0]=11

a.y[1]=11

a.y[2]=11

a.y[3]=11

a.y[0]=22

a.y[3]=22

union类型,数据时重叠在同一块内存区域上的,这个内存区域的大小为对其后的最大长度,这里就是4

高--->低   11 22 33 44

小端从左向右取 y[3]=11

这个题的为难之处呢,就在于前面定义结构体里面用到的冒号,如果你能理解这个符号的含义,那么问题就很好解决了。这里的冒号相当于分配几位空间,也即在定义结构体的时候,分配的成员a 4位的空间, b 5位,c 7位,一共是16位,正好两个字节。下面画一个简单的示意:

变量名  位数

test    15 14 13 12 11 10 9 |8 7 6 5 4 |3 2 1 0

test.a                  |       |0 0 1 0

test.b                  |0 0 0 1 1 |

test.c   0  0  0  0 0 0 0 |        |

高--->低,从右读,每次都一个字节

在执行i=*((short *)&test); 时,取从地址&test开始两个字节(short占两个字节)的内容转化为short型数据,即为0x0032,再转为int型为0x00000032,即50

问题:在80X86架构下,输出什么值?

-128

-256

128

256

char类型的取值范围是-128~127,unsigned char的取值范围是0~256

这里a[0]=256,出现了正溢出,将其转换到取值范围内就是0,即a[0]=0;

同理,a[1]=-1, a[2]=-2, a[3]=-3,在C语言标准里面,用补码表示有符号数,故其在计算机中的表示形式如下:

a[0]=0,     0000 0000

a[1]=-1,    1111 1111

a[2]=-2,    1111 1110

a[3]=-3,    1111 1101

小端机器中:

1111 1101  1111 1110  1111 1111  0000 0000

short是2字节(a[0]和a[1]),由于80X86是小端模式,即数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,在本例中,a[0]中存放的是b的低位,a[1]中存放的是b的高位,即b的二进制表示是:1111 1111 0000 0000,表示-256,故选B。

在32位小端的机器上,如下代码输出是什么:

0x201 , 0x403 , 0x807060504030201 , 0x0

0x201 , 0x605 , 0x807060504030201 , 0x0

0x201 , 0x605 , 0x4030201 , 0x8070605

0x102 , 0x506 , 0x102030405060708 , 0x0

小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构为小端模式。

pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为0x0201。

pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进制为0x05 0x06,对应的16进制数为0x0605。

pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制形式为0x807060504030201。

pint  + 2占用4个字节,指向的array数组的下标为8的元素,8-11个元素没有指定数组的初始化值,默认为0,因此*(pint + 2)对应的16进制为0。

以下代码执行后,val的值是___:

20992

21064

72

0

b << 8 = 0x5200

val = 0x5200 | 0x48 = 0x5248 = 21064

写出一下程序的输出

254

255

256

死循环

选D

这里num值一直是0,num < 255一直是成立的,程序进入死循环

下面这个程序执行后会有什么错误或者效果:

数组越界

死循环

栈溢出

内存泄露

-1

100

0

死循环

Unsigned int型数字最小为0,因此不是死循环,a到0就跳出循环,最后输出0

使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?

%-30.4e

%4.30e

%-30.4f

%-4.30f    f: double精度浮点数    e: 科学计数法

用C++语法来看,下列的哪个赋值语句是正确的?

char a=12

int a=12.0

int a=12.0f

int a=(int)12.0

A项在赋值为0-127时无警告,但B/C/D均有损失精度的警告,编译还是能通过的。B、C、D项的区别是:B 项的默认为double型转向int型,C项因等号后“12.0f”的  ‘f’使其转换为folate型,D项直接通过在等号的右边加“(int)”强制类型转换,与B项相同的是:是从默认的double型转换为int型。A项会对应的ASCII字符,但在大于127时会发生常量截断会有警告。

以下程序的输出结果为

#include "stdio.h"

int func(int x, int y)

{

return (x + y);

}

int main()

{

int a = 1, b = 2, c = 3, d = 4, e = 5;

printf(" % d\n", func((a + b, b + c, c + a), (d, e)));

return 0;

}

9

主要知识点是C++中的逗号操作符! C++ Primer第4版中145页关于逗号操作符论述如下:

逗号表达式的结果是其最右边表达式的值,但是是从左向右计算

以下选项中合法的实型常量是?

0

3.13e-2.1

.914

2.0*10

A选项为整型数据。B选项中e后面必须为整数。D选项是表达式,不是常量,所以选择C。

有如下程序段:

请问执行结果是:

无限循环

浮点数有精确度的限制吧。所以肯定不能除尽,不能使用==和!=,以及位运算

下面两段代码中for循环分别执行了多少次?

32767 16383

答案分析:unsigned short能表示216个数,其范围为0~216-1,j在i前2个位置,i以5的速度增长,j以7的速度增长,当增长到unsigned short表示的最大值又会返回0(以一个圈的形式循环)开始重新走直到i、j相遇,所以就是7t - 5t + 2 = 216,所以为32767次

第二个类似 (7t + 7)-(5t - 3) = 216,所以为16383次

下面有关C++的类和C里面的struct的描述,正确的有?

来自class的继承按照private继承处理,来自struct的继承按照public继承处理

class的成员默认是private权限,struct默认是public权限

c里面的struct只是变量的聚合体,struct不能有函数

c++的struct可有构造和析构函数

有变量int i = 0; int a = i++; int b=++a; int c = a+b; 请问表达式 a?b:c 的值是

0

1

2

3

a=i++. a----0

b=++a. b----1. a----1

c=a+b. c-----2

a?b:c     a为1取b  也就是1

当参数*x==1, *y==1, *z==1时,下列不可能是函数add的返回值的( )?

4

5

6

7

开始不知道啥意思,后经牛客网的大神指点才知道这题要考虑的是,x,y,z三个参数是否指向同一地址(或者说调用该函数时是否实参相同),如:当a=b=c=1时,add(&a,&a,&a),add(&a,&b,&c)。

通过写程序测试得出结果,不可能得到答案7。

有以下5种情况

0818b9ca8b590ca3270a3433284dd417.png

问x等于什么?

5

12

0

随机值

如果是函数外定义那么是0

如果是函数内定义,那么是随机值,因为没有初始化

数字字符0的ASCII值为48,若有以下程序:

程序运行之后的输出结果是:

注意初始化时的数据类型,为char型,即此时int(a)=49,int(b)=50。第一条输出变量b的char类型,即char(b)=2,输出后int(b)自增=51,第二条输出整形即int(b-a)=51-49=2。

(1.3)函数类

从下列函数原形看,用GCC编译时,返回值类型为int的函数有?

char F1(int n);

int F2(char n);

F3(int n);

int *F4(int n);

函数原型格式:

函数返回值 函数名([形参表]);

A:返回char类型

C:默认返回类型为int类型

D:返回整型指针类型

如果没有返回值,必须声明为void类型

设有以下函数void fun(int n,char *s)(......),则下面对函数指针的定义和赋值均是正确的是:()

void (*pf)(int,char); pf=&fun;

void (*pf)(int n,char *s); pf=fun;

void *pf(); *pf=fun;

void *pf(); pf=fun;

B. 函数指针只需要把fun 改成(*pf) ,赋值 直接 pf = fun;即可 函数名赋值.指针函数赋值时候,可以直接用函数名赋值(书上一般都是这样赋值的) .但是也可以用&fun ,取地址操作符复制给函数指针.   pf = &fun;也是可以的.亲测过

程序出错在什么阶段__?

预处理阶段出错

编译阶段出错

汇编阶段出错

链接阶段出错

运行阶段出错

程序运行正常

http相当于一个label,//www.taobao.com是注释,所以答案错误,可以运行

(1.3.1)重载类

不能作为重载函数的调用的依据是:

参数个数

参数类型

函数类型

函数名称

std::vector::iterator重载了下面哪些运算符?

++

>>

*(前置)

==

在重载运算符函数时,下面()运算符必须重载为类成员函数形式()

+

-

++

->

只能使用成员函数重载的运算符有:=、()、[]、->、new、delete。

如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是:

一元运算符

二元运算符

选项A)和选项B)都可能

重载错误

友元函数重载时,参数列表为1,说明是1元,为2说明是2元 成员函数重载时,参数列表为空,是一元,参数列表是1,为2元

类成员函数的重载、覆盖和隐藏区别描述正确的有?

覆盖是指在同一个类中名字相同,参数不同

重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字

派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数

函数名字相同,参数相同,基类无virtual关键字的派生类的函数会"隐藏"父类函数

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

(1.3.2)静态类

关于static用途说法正确的是?

声明静态外部类

声明静态外部全局变量

声明静态外部函数

声明静态局部变量

下面对静态成员的描述中,正确的是:

静态数据成员可以在类内初始化

静态数据成员不可以被类对象调用

静态数据成员不能受private控制符的作用

静态数据成员可以直接用类名调用

1、静态数据成员同样受 private,public,protected 等权限符限制

2、静态数据成员由于是属于整个类的,静态数据成员存储在静态数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义(即初始化),对它们的初始化一般在类外,但是,当类型为const static时的整形时可以在类体内进行初始化。3、可以通过累的对象,指针,类名等直接调用静态成员4、类的静态成员函数可以在类内进行定义,也可以在类外,类的静态成员函数只能直接调用静态成员,如果想调用非静态成员只能通过间接的方式,而非静态成员可以直接访问静态成员。

Fill the blanks inside class definition

Running result : 0 20 1 20

static/const

const/static

--/static

conststatic/static

None of above

对于成员变量a,若它为const类型,那么必须要使用Test::Test(int _a , int _b) : a( _a )这种初始化形式,若它为普通成员变量,也可以采取Test::Test(int _a , int _b) : a( _a )这种形式,所以a可以为const或者普通类型,由于b没有采取Test::Test(int _a , int _b) : b( _b )这种形式,所以b一定不是const类型,有main()中的t1.b和t2.b的输出都是20可以知道,b是静态变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值