【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段

【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段_第1张图片

1. 下列main()函数执行后的结果为()

int func(){
int i, j, k = 0;
for(i = 0, j = -1;j = 0;i++, j++){
k++;
}
return k;
}
int main(){
 cout << (func());
 return 0;
}

A. -1
B. 0
C. 1
D. 2

判断为赋值语句,j等于0
0为假不进循环
选B.

2. 下面程序输出是什么?

#include 
int main()
{
int a=1,b=2,c=3,d=0;
 if(a == 1 && b++==2)
 if(b!=2||c--!=3)
 printf("%d,%d,%d\n" ,a,b,c);
 else
 printf("%d,%d,%d\n" ,a,b,c);
 else
 printf("%d,%d,%d\n" ,a,b,c);
 return 0;
}

A. 1,2,3
B. 1,3,2
C. 3,2,1
D. 1,3,3

else会和离自己最近的if匹配
逻辑或,左边为真就不会执行右边的判断
选D.

3. 若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是()

A. char
B. int
C. double
D. float

不同类型的表达式进行计算的时候
表示范围小的类型会自动提升到
表示范围大的数据类型
char的表示范围为-128-127
int表示范围为-21亿到21亿
double表示范围为2.3 * 10^-308
到1.7 * 10^308
选C.

4. 在int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};中,p[1][2]的值是()

A. 1
B. 0
C. 6
D. 2

每列未初始化的地方默认为0
【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段_第2张图片
选B.

5. 以下程序的运行结果是()

#include 
int main(void) {
printf("%s , %5.3s\n", "computer", "computer");
return 0;
}

A. computer , puter
B. computer , com
C. computer , computer
D. computer , compu.ter

%m.ns
m:输出字符串的宽度
n:左起截取目标字符串的n个字符,右对齐,补充空格
如果字符串长度>n>m 此时m的作用失效,只有n起作用
如果n>字符串长度,遇到\n自动停止打印
如果%-m.ns代表左对齐
如图:
5表示宽度为5
3表示从左开始截取3个字符右对齐
不够补两个空格
【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段_第3张图片
宽度为10,只需要3个字符
需要补7个空格
【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段_第4张图片
选B.

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

A. %-30.4e
B. %4.30e
C. %-30.4f
D. %-4.30f

%e 或 %E:用于输出科学计数法表示的浮点数
格式%m.nf:默认右对齐,m表示宽度
如果需要左对齐需要在m前面加-
n表示精度
选C.

7. 请找出下面程序中有哪些错误()

int main(){
 int i = 10;
 int j = 1;
 const int *p1;//(1)
 int const *p2 = &i; //(2)
 p2 = &j;//(3)
 int *const p3 = &i;//(4)
 *p3 = 20;//(5)
 *p2 = 30;//(6)
 p3 = &j;//(7)
 return 0;
}

A. 1,2,3,4,5,6,7
B. 1,3,5,6
C. 6,7
D. 3,5

常量指针:指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变
指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值是可以发生改变的,可以通过指针解引用改变指针所指空间的值
区分:const *的相对位置::
const 在 *的左边: 常量指针
const 在 *的右边: 指针常量
选C.

8. 下面叙述错误的是()

char acX[]="abc";
char acY[]={'a','b','c'};
char *szX="abc";
char *szY="abc";

A. acX与acY的内容可以修改
B. szX与szY指向同一个地址
C. acX占用的内存空间比acY占用的大
D. szX的内容修改后,szY的内容也会被更改

szX与szY都是指针,指向同一个常量字符串,所以也是指向同一个地址
字符串有一个\0,也占用一个空间,所以 szX占用空间比acY大
选D.

9. 下列关于C/C++的宏定义,不正确的是()

A. 宏定义不检查参数正确性,会有安全隐患
B. 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C. 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D. 相对于函数调用,宏定义可以提高程序的运行效率

B说反了,宏定义没有类型安全检测,在预处理进行了宏替换而无法进行调试。
所以说要尽量使用const常量,避免使用宏定义常量
选B.

10. 有以下定义:

int a[10];
char b[80];

函数声明为:

void sss(char[],int[]);

则正确的函数调用形式是()
A. sss(a,b);
B. sss(char b[],int a[]);
C. sss(b[],a[]);
D. sss(b,a);

函数调用的时候,如果参数是数组,传参时,只要传数组名即可
选D.

11. 以下 C++ 函数的功能是统计给定输入中每个大写字母的出现次数(不需要检查输入合法性,所有字母都为大写),则应在横线处填入的代码为()

void AlphabetCounting(char a[], int n) {
 int count[26] = {}, i, kind = 10;
 for (i = 0; i < n; ++i)
 _________________;
 for (i = 0; i < 26; ++i) {
 printf("%c=%d", _____, _____);
 }
}

A.
++count[a[i]-‘Z’]
‘Z’-i
count[‘Z’-i]
B.
++count[‘A’-a[i]]
‘A’+i
count[i]
C.
++count[i]
i
count[i]
D.
++count[‘Z’-a[i]]
‘Z’-i
count[i]

A和B减出来都是小于0的,而下标是大于等于0的
C用i作下标,而i的下标取决于n(字符串长度),字符串长度是可能大于数组的
D:‘Z’-a[i]如果a[i]是’Z’结果是0,如果是’Y’结果就是1

选D

12. 在32位cpu上选择缺省对齐的情况下,有如下结构体定义:

struct A{
unsigned a : 19;
unsigned b : 11;
 unsigned c : 4;
unsigned d : 29;
 char index;
};

则sizeof(struct A)的值为()
A. 9
B. 12
C. 16
D. 20

32位下32bit(4字节)对齐,a占19bit剩13bit,还可以放一个b,对齐占4字节
c占4bit,剩28bit放不下d,对齐占4字节
d占29bit,对齐占4字节
char占1字节,结构体总大小等于最大宽度整数倍,所以是16字节
选C.

你可能感兴趣的:(笔试常见编程题,c++,算法,数据结构)