1.下列 C 代码中,不属于未定义行为的有:______。
A int i=0;i=(i++);
B char *p=”hello”;p[1]=’E’
C char *p=”hello”;char ch=*p++
D int i=0;printf(“%d%d\n”,i++ i--)
E 都是未定义行为
F 都不是未定义行为
分析:
未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,
所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,
可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。
当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生
//B
http://selfboot.cn/2016/09/18/c++_undefined_behaviours/
2.哪个操作符不能作为类成员函数被重载?
A ?:
B ++
C []
D ==
E *
//A
3.#include <stdio.h>int main() {
int a, b;
for (a = 1, b = 1; a <= 100; a++)
{ if (b >= 20)
break;
if (b % 3 == 1)
{
b += 3;
continue;
}
b -= 5;
}
printf("%d\n", a);
return0;
}
上面的输出结果为?
//错误点: continue理解错误,跳过下面语句执行下次次循环//分析: ab初始值为 1 1
第一次: 24
第二次: 37/410/513/616/719/822结束
4.以下代码输出什么?
int a =1,b =32;
printf("%d,%d",a<<b,1<<32);A1,1
B 1,0
C 0,0
D 0,1
//分析:
c++ primer 5th, 英文版 第153页 ,有句“the right-hand operand must not be nagative
and must be a value that is strictly less than the number of bits in the result,
otherwise,the operation is undefined.”
执行a<<b时,编译器会先将b与31进行and操作,以限制左移的次数小于等于31。b&31=0,则a<<b=1
执行1<<32时,编译器直接执行算术左移的操作。
选择B
5.下面这个程序执行后会有什么错误或者效果:
#define MAX 255int main()
{
unsignedchar A[MAX], i;
for (i = 0; i <= MAX; i++)
A[i] = i;
}
//分析:
死循环加数组越界访问(C/C++不进行数组越界检查)
MAX=255
数组A的下标范围为:0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
由于unsignedchar的取值范围在(0..255),i++以后i又为0了..无限循环下去.
7.下列哪个用法那个是错误的( )
A typedefvoid (*FUN)();
B constint &ra;
C externconstintarray[256];
D int* a;
//C++中引用要初始化。//const修饰的常遍量要初始化。//B
8.
"My salary was increased by 15%!"
下列哪个选项可以准确的显示出上述语句?
A printf("\"My salary was increased by 15/%\!\"\n");
B printf("My salary was increased by 15%!\n");
C printf("My salary was increased by 15'%'!\n");
D printf("\"My salary was increased by 15%%!\"\n");
//解析:
A: 没\!这转义符,编译时报错
B,C: 一看前面输出时就少了双引号
D是对的,里面%%是输出的%,虽然有些编译器\%也能输出%,但貌似标准c不支持
\" 将"转义
9.
Which ofthe following statement(s) equal(s) value1in C programming language?
A thereturnvalueof main functionifprogramendsnormally
B return (7&1)
C char *str="microsoft"; return str=="microsoft"
D return"microsoft"=="microsoft"
E None ofthe above
//
A.main成功返回,是0
B. 按位与 7&1 = 111 & 001 = 001 即 1
C.str这个指针就是指向"microsoft"这个字符串常量的地址,所以,str == "microsoft" 自然是成立的,
D. 两个相同的字符串常量是放在同一个内存地址的,所以也相等
答案为BCD
10.math.h的abs返回值()
A 不可能是负数
B 不可能是正数
C 都有可能
D 不可能是0
//num为0或正数时,函数返回num值;
当num为负数且不是最小的负数时,
函数返回num的对应绝对值数,即将内存中该二进制位的符号位取反,并把后面数值位取反加一;
当num为最小的负数时(即0x80000000),由于正数里int类型32位表示不了这个数的绝对值
,所以依然返回该负数
11.下列代码的输出结果是
int i = -1;
unsigned j = 1;
if (j > i)
printf(" (j>i)成立\n");
elseprintf(" (j>i)不成立\n");
if (i < j)
printf(" (i<j)成立\n");
elseprintf(" (i<j)不成立\n");
A (j>i)成立,(i<j)成立
B (j>i)不成立,(i<j)成立
C (j>i)成立,(i<j)不成立
D (j>i)不成立,(i<j)不成立
//D
14.
有如下程序段:
char fun(char *);
main()
{
char *s = “one”, a[5] = {0}, (*f1)(char *) = fun, ch;
}
则对函数fun的调用语句正确的是:
A *f1(&a);
B f1(*s);
C f1(&ch)
D ch = *f1(s);要改成(*f1)(s)才正确
//
CD 都正确,
D是正确的啊,不知道下面都是啥意思?
函数指针在C++premier plus上写的很清楚,函数指针可以直接用f1(s)也可以用(*f1)(s) ,但是*f1(s)是错误的.
15.若有以下程序段:
……
int a[]={4,0,2,3,1},i,j,t;
for(i=1;i<5;i++)
{
t=a[i];
j=i-1;while(j>=0&&t>a[j])
{
a[j+1]=a[j];
--j;
}
a[j+1]=t;
}
……
则该程序段的功能是:
A 对数组a进行插入排序(升序)
B 对数组a进行插入排序(降序)
C 对数组a进行选择排序(升序)
D 对数组a进行选择排序(降序)
//
插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,
空出一个适当的位置,把待插入的元素放到里面去
选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别)。
16.一张1024×640分辨率的图片,假定每个像素用16位色彩表示,用位图文件(bitmap)格式存储,则这张图片文件需要占用多大的存储空间____。
A 40KB
B 640KB
C 1280KB
D 2560KB
E 5120KB
F 10240KB
//1024*640*16 bit = 1024*640*16/8 B = 1024*640*16/8/1024 KB = 1280KB