最近一直在找工作,前几天去了。H3C笔试结束后,问题还可以。我偷偷地写了一些答案和分析。我希望它对你有用.
1.以下描述是正确的(AD)
A、1个字节(byte)由8个比特(bit)组成
B、signed char取值范围为-127~128
C、0xFFFFFFFF是4字节无符号中最大的
D、unsigned char类型的值范围为0~255
解析:
signed char值范围为-128~127,为-(2^8)~(2^8-1);
0xFFFFFFFF是无符号整形的最大值,如果包含浮点类型,那么它就不是最大的。
2、以下代码的运行结果(D)
#define ADD(x, y)(x y)
#define SUB(x, y)(x)-(y)
#define MUL(x, y) (x * y)
Unsigned int uiA
uiA = MUL(ADD(x, y), SUB(6, 3));
A、uiA=15B、uiA=33
C、uiA=18D、uiA=63
分析:预编译后展开的公式:uiA = ((9 2) * (6) - (3));
3.以下代码运行结果(B)
代码I:
usigned int uiA;
uiA = (0x55 & 0x66)^ (0x77 | 0x88);
代码II:
unsigned int uiB;
uiB = (0xAA << 3) | (0xBB << 2) | (0xCC << 1) | 0xDD;
A 代码I,uiA = 0xAAB 代码I,uiA = 0xBB
C 代码II,uiB=0xFFFFFFFFD 代码II,uiB=0xAABBCCDD
4.可以判断以下句子uiNum(unsigned int)有些可以被16整除(AC)
A if(((uiNum / 16) * 16 == uiNum)
B if((uiNum % 15) == 0)
C if((uiNum & 0x0F) == 0)
D if(((uiNum >> 5) << 5) == uiNum)
解析:B改成if((uiNum)== 0)
D改成if(((UiNum >> 4) << 4) == uiNum)
5.正确描述以下代码。(AB)
代码I:
const char *pcStr =“abcdefg”;
daimaII:
void string_sizeof(char szStr1[10])
{
char szStr2[10] =“12345”;
printf(“%u,“, sizeof(szStr1));
printf(“%u\r\n”, sizeof(szStr2));
return;
}
代码III:
typedef unsigned int *pui_t1;
#define pui_t2 unsigned int *
pui_t1 puiA, puiB;
pui_t2 puiC, puiD;
代码IV:
unsigned int uiA = 100;
printf(“%s\r\n”, uiA);
A、代码I,const修饰符表明pcStr指向内容不能改变;
B、代码II,程序运行结果为4、10;
C、代码III,puiA、puiB、puiC和puiD都是unsigned int *类型变量;
D、代码IV,打印unsigned int不应使用%%s会导致程序访问非法地址。
解析:const char *pcStr和char * const pcStr的区别.
B中szStr1是数组名,相当于以函数参数的形式传递指针,所以是4;szStr2是局部变量数组,用sizeof相当于求数组的大小,所以是10.
C中使用define定义相当于替换,所以展开后unsigned int * puiC, puiD所以很明显puiD不是unsigned int *类型
D中%s需要传递一个地址,二uiA它是一个变量值,所以它会出错,如果改为&uiA就可以了.
6.正确描述结构和联合体的大小。(C)
struct A_S
{
unsigned short us1;
unsigned short us2;
unsigned short us3;
};
struct B_S
{
unsigned char uc1;
unsigned int ui2;
unsigned short us3;
};
union C_U
{
unsigned short us1;
unsigned short us2;
unsigned short us3;
};
union D_U
{
unsigned char uc1;
unsigned int ui2;
unsigned short us3;
};
A、结构体struct A_S的大小是2;
B、结构体struct B_S的大小是7;
C、联合体union C_U的大小是2;
D、联合体union D_U的大小是7。
分析:情况下,结构体的大小需要自然边界对齐。A_S大小是6,B_S大小12,;
联合体大小是最大类型的大小之一。
7.链表操作以下描述正确(ABC)
struct SLL
{
struct SLL *pstNext;/*下一节点*/
};
struct DLL
{
struct DLL *pstNext;/*下一节点*/
struct DLL *pstPrev;/*前一节点*/
};
A、节点可以删除以下代码B:
pstA->pstNext = pstA->pstNext->pstNext;
free(pstA->pstNext);
B、节点可以删除以下代码B:
pstA->pstNext = pstB->pstNext;
free(pstB);
C、节点可以删除以下代码B:
pstB->pstPrev->pstNext = pstB->pstNext;
pstB->pstNext->pstPrev = pstB->pstPrev;
free(pstB);
D、节点可以删除以下代码B:
pstA->pstNext = pstA->pstNext->pstNext;
pstA->pstNext->pstPrev = pstA;
free(pstB);
解析:D改成:
pstA->pstNext = pstA->pstNext->pstNext;
pstA->pstNext->pstNext->pstPrev = pstA;
free(pstB);
就可以了.
8.以下代码的运行结果是(B)
代码I:
unsigned int uiCount = 0;
while(uiCount <= 5)
{
if (unCount <= 5)
continue;
uiCount;
}
printf(“uiCount=%u\r\n”, uiCount);
代码II:
unsigned int uiCount = 0;
do
{
uiCount++;
}while(uiCount >= 5);
printf(“uiCount=%u\r\n”, uiCount);
代码III:
unsigned int uiCount = 0;
switch (unCount)
{
case 0:
uiCount = 5;
default:
uiCount = 1;
}
printf(“uiCount=%u\r\n”, uiCount);
代码IV:
unsigned int uiCount = 0;
for( ; uiCount <= 10; uiCount++)
if (uiCount == 5)
breakl
printf(“uiCount=%u\r\n”, uiCount);
A.代码I, uiCount=5
B.代码II, uiCount=1
C.代码III, uiCount=1
D.代码IV, uiCount=6
解析:代码I会陷入无限循环,continue会在uiCount<=5时跳过++uiCount,uiCount的值是0,所以没有机会++uiCount了
代码IV,uiCount=5,break之后uiCount++没有机会执行了.