前言
一.选择题
1.第一题
#include<stdio.h>
int main(){
unsigned char i = 7;
int j = 0;
for(;i > 0;i -= 3){
++j;
}
printf("%d\n", j);
return 0;
}
请问程序输出多少?
A 2
B 死循环
C 173
D 172
解析 c
首先i是无符号数取值范围是0-255
经过两次循环,i的值为1,再减3,i的值为254…
255刚好是3的85倍
1的位置经过85次循环会变到2的位置,再经过85次变到3的位置
再经过一次就会变为0,所以总共经过85+85+1+2=173
2.第二题
下面两个结构体
struct One{
double d;
char c;
int i;
}
struct Two{
char c;
double d;
int i;
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是()
A 16 24,16 24
B 16 20,16 20
C 16 16,16 24
D 16 16,24 24解析 c
默认对齐数为4时
one 8+1=9 不是4的整数倍所以12+4=16
two 1不是4的整数倍· 所以4+8+4=16
默认对齐数为8时
one 12+4=16
two 8+8+4=20 不是8的整数倍所以应该是24
3.第三题
3.下列C程序执行后c输出结果为()(32位)
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a = -3;
//10000000 00000000 00000000 00000011
//11111111 11111111 11111111 11111100
//11111111 11111111 11111111 11111101
unsigned int b = 2;
//00000000 00000000 00000000 00000010
long c = a + b;
//11111111 11111111 11111111 11111111
printf("%ld\n", c);
}
解析 c
考察数据存储
4第四题
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};中,p[1][2]的值是()
A 1
B 0
C 6
D 2
解析
1 0 0 0
3 2 0 0
4 5 6 0
由此可见为0
5.第五题
int fun(int a){
a^=(1<<5)-1;
return a;
}
fun(21)运行结果是()
A 10
B 5
C 3
D 8
解析 A
1<<5的值为
00000000 00000000 00000000 00100000
再减1
00000000 00000000 00000000 00011111
21 16+4+1
00000000 00000000 00000000 00010101
相同为0 相异为一
00000000 00000000 00000000 00001010
8+2=10
二.编程题
1.第一题
class Solution {
public:
void replaceSpace(char *str,int length)
{
char*p=str;
int spacecount=0;
while(*p)
{
if(*p==' ')
{
spacecount++;
}
p++;
}
char* end1=str+length-1;
char* end2=str+length+2*spacecount-1;
while(end1!=end2)
{
if(*end1!=' ')
{
*end2--=*end1--;
}
else
{
* end2--='0';
* end2--='2';
* end2--='%';
end1--;
}
}
}
};