1. 存在int类型变量x,y,z,其对应值为x=0x59,y=0x39,z=0x6E,则x * y + z的值为()
A:1 0010 0111 0011
B:1 0100 0011 1111
C:1 0010 0111 0111
D:1 0110 0111 1111
本题考查进制之间的转换
x = 0x59 = 5*16 + 9*1 = 89;
y = 0x39 = 3*16 + 9*1 = 57;
z = 0x6E = 6*16 + 14*1 = 110;
x * y + z = 89*57 + 110 = 5183
二进制为:1 0100 0011 1111
2. 在64位机器上用gcc编译以上代码,求sizeof(struct A),sizeof(struct B)分别是多少()
struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
short b;
int c;
char d;
};
A:12 16
B:12 12
C:16 24
D:16 12
本题考查内存对齐规则,直接上博客,看完就懂
3. 如下函数的f(1)的值为()
int f(int n)
{
static int i = 1;
if(n >= 5)
return n;
n = n + i;
i++;
return f(n);
}
A:5
B:6
C:7
D:8
本题考查的是函数递归和static变量
首先局部static变量,只会初始化一次,存放在静态区;
所以i的值是一直增加的;
4. 32位系统下,对于下面的结构体A和B,sizeof(A),?sizeof(B)的结果分别是()
#include <stdio.h>
#pragma pack(2)
struct A
{
int a;
char b;
short c;
};
#pragma pack()
#pragma pack(4)
struct B
{
char b;
int a;
short c;
};
#pragma pack()
int main()
{
printf(“%d %d\n”,sizeof(struct A),sizeof(struct B));
return 0;
}
A:8,8
B:8,10
C:8,12
D:7,8
????????这里涉及的是设置默认对齐数,设置的默认对齐数依旧是要和我们变量的自身对齐数做比较的,之后变量占的字节空间是自身的大小
5. 以下能对二维数组a进行正确初始化的语句是(????????)
A:int a[2][ ]=({1,0,1},{5,2,3});
B:int a[ ][3]={{1,2,3},{4,5,6}};
C:int a[2][4]=({1,2,3},{4,5},{6});
D:int a[ ][3]={(1,0,1)(),(1,1)};
本题考查的是对二维数组的初始化
记住下面几点:
1. 必须显示地写出列,可以省略行,不可以省略列;
2. 不可以用空括号,可以用空大括号。
3. 千万别定义越界
4. 没有初始化到的默认为0
A:错误,省略了列;
B:正确,表示的是两行三列的二维数组;
C:错误,明确指出是两行,后面越界了
D:错误,这里注意是小括号,就是逗号表达式;int a[][3] = {1,(),1};但是不可以是空括号!