第一题
1.在C语言中,表示一次性地给数组a的10元素赋值()
int a[10];scanf("%d",a);
A:正确
B:错误
答案及解析 B
我们知道单独的数组名就是首元素地址,但是也有两种情况数组名表示的是整个数组的大小
1. sizeof(数组名),数组名表示整个数组的地址,计算的是整个数组的所占字节大小
2. &数组名,取的就是整个数组的地址,但是打印出来也是数组首元素地址
所以本题arr就是表示的首元素地址,赋值也只能给首元素赋值;
但是如果是下面这样的代码呢?
#include <stdio.h>
int main()
{
int arr[10] = {0};
scanf("%d",&arr);
for(int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
这是C表示的方法,我们这里scanf后面是&arr,是取这个整个数组的地址,那这样我们就可以给整个数组赋值了吗?答案是不可能的,正如我们上面说的,&arr表示 出来也是首元素地址,所以这样的情况依旧是给首元素赋值;
综上所述,要想给数组元素赋值,就老老实实初始化吧!,或者弄个循环。
第二题
2. 下面两个结构体,在默认对齐数为 #pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是
struct One { double d; char c; int i; } struct Two { char c; double d; int i; }
A:16 24,16 24
B:16 20,16 20
C:16 16,16 24
D:16 16,24 24
答案及解析 C
这个题重要的一点是要知道在设置默认对齐数的时候
对齐数 = 默认对齐数和每个变量的自身字节大小的较小值;
关于内存对齐的博客:C/C++内存对齐规则(结构体、联合体、类)-CSDN博客
所以本题当默认对齐数为4的时候,double的对齐数就是4了,注意的是要占的字节是自身大小,很多人把对齐数和占的空间大小混淆。记住占的空间大小就是本身字节大小,而对齐数只是对于偏移的地址来说的;
第三题
3. ()是构成C语言的基本单位
A:函数
B:过程
C:子程序
D:子例程
答案及解析 A
函数是构成C语言的基本单位,因为我们的C语言程序都是函数组成的,最核心的main函数,之后都是别的函数;
第四题
4. 有以下程序程序运行后的输出结果是()
#include <stdio.h> int main() { int m=12,n=34; printf("%d%d", m++, ++n); printf("%d%d\n", n++, ++m); return 0; }
A:12353514
B:12353513
C:12343514
D:12343513
答案及解析 A
前置++返回的是++之后的值,后置++返回的是++之前的值,然后m的值加一;
这个在C++primer中曾介绍,后置++的底层,是实现的一个函数,函数中是用一个临时变量拷贝了这个值,然后++原来的,返回拷贝;而前置++就是直接对这个值+=1,再返回这个值
第五题
5. 以下程序的输出结果是()
#include <stdio.h> int main() { char x=040; printf("%o\n", x << 1); }
A:100
B:80
C:64
D:32
答案及解析 A
本题考查的是你认不认识八进制数字,以0开头的为八进制数字,以%o的形式打印的也是八进制,所以本题主要考查对八进制进行移位操作和是否会发生类型的截断;因为char类型只有一个字节,八个比特位;
所以先把040 -->十进制 --> 二进制数字;
八进制 | 十进制 | 二进制 |
0 4 0 | 32 | 1 0 0 0 0 0 |
64 8 1 | 32 16 8 4 2 1 |
所以在这里是没有发生截断的,因为100000只需要6个比特位;而char为8个比特位;
所以正常发生左移一位,右边补0,1000000
换成十进制为64;
转换为八进制就为100