文章目录
- 选择题
选择题
1, 以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A 是无限循环
B 循环次数不定
C 4次
D 3次
解析 : C,for循环y = 123 是赋值语句, 也就是一直为真, 只用关心x,x < 4 x = 0, 1, 2,3 循环4次。
2,
以下程序的运行结果是()
#include <stdio.h>
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
解析 : B, %5.3s, 先取出5个字符, 然后再从5个字符里面拿出3个字符出来
3,
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
解析 : for循环要先判断!! , j = 0是赋值语句, 直接为假, for循环不执行
4,下面程序输出什么?
#include <stdio.h>
int main()
{
int a=1,b=2,c=3,d=0;
if(a == 1 && b++==2) //为真 a = 1 , b = 3
if(b!=2||c--!=3) // b != 2为真, 后面的 c--!=3就不执行了,所有结果为 1, 3 , 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
解析 : D, 见注释, 强调 1 , || 和 && 会中断 2, if else 与最近的匹配
5,若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是()
A char
B int
C double
D float
解析 : C, 低字节类型向高字节类型发生提升, 这样才可以进行计算
6,
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
求 p[1][2]的值
A 1
B 0
C 6
D 2
解析 : B, p[1][2] 求的是1行2列的值, 数组的下标是从0开始的。题目的一维数组都是不完全初始化,默认缺少的值为0
7,选择表达式 11|10 的结果(本题数值均为十进制)()
A 11
B 10
C 8
D 2
解析 : A ,这是按位或,依赖的是比特位 11 | 10 ------> 1011 | 1010 = 1011 (11), || 这个是逻辑或,返回值为bool值
8,
int fun(int a)
{
a ^= (1<<5)-1;
return a;
}
fun(21)运行结果是()
解析 : 10, 牢记一点 ^= , |= , += , -=,涉及赋值运算符的优先级都是相当低的。 先算括号里面的然后-1 结果 : 11111
然后按位异或21(10101) 按位异或后 ----> 1010 结果为10
9,若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A *p+=1;
B (*p)++;
C ++(*p)
D *p++
结果 : D。 D选项中的后置++作用的其实是指针p, 相当于是 p = p + 1; 向后偏移了4个字节, 而非指向的内容 + 1
10,下面关于指针描述不正确的是 :
A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址
解析 : A ,需要手动置为NULL
11,使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以
下哪个选项是正确的?
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30f
解析 : C, 左对齐是负号, 右对齐是正号, 控制精度是 .xf (控制在x位精度)
12, 请找出下面程序中有哪些错误()
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
解析 : C, const放在 ’ * ’ 的前面, 修饰的是 ‘ *p ’ , p指向的内容不能改变, 放在 ‘ * ’的后面,修饰的是p, p不能改变指向
扩展: 关于引用, 权限只能缩小, 不能扩大。
13, 下面叙述错误的是()
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的内容也会被更改
解析 : D char* 实质上是 const char* , 因为是常量字符串,C++11已经规定写之前必须加const了, 不然会报错。也就是不能修改。
14,在头文件及上下文均正常的情况下,下列代码的运行结果是()
int a[] = {1, 2, 3, 4};
int *b = a;
*b += 2; // a[0] = 3;
*(b + 2) = 2; // a[2] = 2;
b++; // b = a + 1;
printf("%d,%d\n", *b, *(b + 2)); // a[1] a[3]
A 1,3
B 1,2
C 2,4
D 3,2
解析 : C ,看注释
15, 下列关于C/C++的宏定义,不正确的是()
A 宏定义不检查参数正确性,会有安全隐患
B 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D 相对于函数调用,宏定义可以提高程序的运行效率
解析: B A,C,D都正确, B的更容易理解? 避免使用const有点错误, const和宏定义一样,其实差别不大。
16,有以下定义:
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, 解析 函数声明的那一部分, 实质上就是传数组起始元素的地址, 也就是数组名
17.,用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整
型数()
A int *a[10];
B int (*a)[10];
C int (*a)(int);
D int (*a[10])(int);
解析: D 牢记 : [ ]的优先级大于 * , 所以排除B,C, 然后的话指向函数,A无返回值,排除。
18,
以下 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 c
ount[i]
D
++count[‘Z’-a[i]]
‘Z’-i
count[i]
解析 : D ’Z‘ 字符是最大的, ’A‘字符是最小的,A,B均会出现越界的问题, C肯定错,
在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
解析 : C , unsigned默认是无符号数, 是4个字节。 也就是32个bit位, a + b公用一个, c 用一个, d用一个, char是一个字节 , 也就是4 + 4 + 4 + 1 = 13个字节,对齐到4个字节, 也就是16个字节。
下面代码会输出()
int main()
{
int a[4]={1,2,3,4};
int *ptr=(int*)(&a+1);
printf("%d",*(ptr-1));
}
A 4
B 1
C 2
D 3
解析 : A, &数组名,取出的是整个数组的地址, +1 直接跳过整个数组, -1到最后一个元素