1、下面关于delete描述错误的是(C)
A 它必须用于new返回的指针
B 使用它删除对象时要调用析构函数
C 对一个指针可以使用多次该运算符
D 指针名前只有一对方括号符号,不管所删除数组的维数
解析:不能对一个指针使用多次 delete。因为 delete 以后,此内存已经被收回,可能被分配用于其它数据,因此再次 delete 导致其它数据被非法修改,这是一种不确定的行为。
delete 用于释放 new 创建的内存,delete [] 用于释放 new 创建的数组内存。delete 后面只能跟上 new 返回的指针变量。
使用 delete 释放对象内存时会调用对象的析构函数。
2、函数rewind的作用是
使位置指针重新返回文件的开头
3、
b=2, c=3
a=-1,表达式的值为-1,非零,为真,故b=2;
a=0,表达式的值为,为零,为假,故c=3;
4、下面的类型声明中正确是(D)
A int & a[4];
B int &=p;
C int &&q;
D int i,*p=&i;
C++中不能建立引用数组和指向引用的指针,也不能建立引用的引用。
5、#include
前者首先从Standard Library的路径寻找和引用file.h,而后者首先从当前工作路径搜寻并引用file.h
6、若用数组名作为函数的实参,传递给形参的是数组第一个元素的值。请问这句话的说法是正确的吗?
错误
代表的是该数组最开始的一个元素的地址,等同于可以运算的指针,而不是固定的第一个数组元素。
7、
void test(void *data) {unsigned int value = (此处应填入)printf("%u", value);
}
using namespace std;
int main() {unsigned int value = 10;test(&value);return 0;
}
*((unsigned int *)data)
参数类型是void, 所以先要进行指针转换:(unsigned int *)然后再取值。
8、阅读下面代码,程序会打印出来的值是?
#include void f(char **p) { *p += 2; }
void main() {char *a[] = {"123", "abc", "456"}, **p;p = a;f(p);printf("%s", *p);
}
3
p+=2;就相当于p=p+2; 其中p指向字符串“123”的第一个元素,即‘1’,指针p向后移两个元素的地址,即指向‘3’ 而*(p+2)才是基于p每次向后移一个字符串的长度,即*(p+2)指向“456”
9、C 语言俗称"低级语言的高级形式",这说明C 语言的功能不强。请问这句话的说法是正确的吗?
错误
语言的高级还是低级与语言的功能无关,他的判别标准是相对于自然语言和机器语言的接近程度而言的。
越接近自然语言的语言越高级,反之,越接近机器语言的就越低级。
通常情况下,越低级的语言机器执行效率越高,但对编程者的要求也更高,可自行对比汇编和python。
10、下面程序的输出结果是()
#include
using namespace std;
int i = 0;
int fun(int n) {static int a = 2;a++;return (a * n);
}int main() {int k = 5;{int i = 2;k += fun(i);}k += fun(i);cout << k;return (0);
}
11
当局部变量和全局变量重名时,局部变量会屏蔽全局变量
{ } 也能组成一个作用域,所以在{ }内 调用的是 int i = 2 而出了作用域 则是调用了全局的i
静态局部变量相当于全局变量(只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的),函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值(也就是说,如果a是static的,那么只有在第一次进入这个函数的时候会执行a=2,以后都不会执行。)。
11、在c语言中,一个函数不写返回值类型,默认的返回类型是
int
一个函数没有返回值时,是void型,此时的void关键字不能省略(不写);
一个函数省略(不写)返回值类型时,默认是int型;
12、fread(buffer, size, count, fp);
,其中buffer代表的是
一个指针,指向要读入数据的存放地址
13、对类中声明的变量,下列描述中正确的是
属于该类,某些情况下也可被该类不同实例所共享
C++对于类成员具有三种访问权限控制,私有类型不能实现任意实例的随意访问
14、int (*p)[3] 中p的含义是什么?
一个指向元素个数为3的int数组的指针
15、以下不正确的定义语句是
char c2[] = {'\x10', '\xa', '\8'};
\xhh,表示asc码未十六进制数hh所代表字符。 \xddd,表示asc码未八进制数hh所代表字符。
单纯的反斜杠默认为八进制,为0-7,不会出现8
16、在32位系统环境,编译选项为4字节对齐,那么sizeof (A)和sizeof (B)是
struct A {int a; //4short b; //2int c; //4char d; //1
};struct B {int a; //4short b; //2char d; //1int c; //4
};
16,12
17、有以下语句定义
int x =5;
const int * const p = &x;
const int &q=x;
int const *next=&x;
const int *j=&x;
则有语法错误的是()
谁在 const 右边,谁不能改变
去掉类型名
const 右边是 * 变量名,则 *变量名 不能修改;
const 右边是 变量名,则 变量名 不能修改;
eg:
int const val; 和 const int val; val++是错误的
int const *val; 和 const int * val; (*val)++是错误的
18、有以下程序
int main() {char a, b, c, d;scanf("%c,%c,%d,%d", &a, &b, &c, &d);printf("%c,%c,%c,%c\n", a, b, c, d);return 0;
}
若运行时从键盘上输入:6,5,65,66<回车>。则输出结果是()
char型数据以%d输入时,输入的是ascii码值;c中存入的是ascii码65,也就是A;
而对于a,是以字符型存入,相当于char a = 6;6在a中存储是字符型的,最终输出的也是字符6;
而实际中,字符6的ASCII码是54,若:printf(“%d\n”,a);输出就是54
19、以下程序的输出结果(32位机器上)是()
int main(){char *p = "abcdefgh", *r;long *q;q = (long*)p;q++;r = (char*)q;printf("%s\n", r);
}
char* p = “abcdefgh”,每个字符占1个字节,那么总共是8个字节,此时p指向’a’。如果是p++,那么p将指向’b’。打印p会得到"bcdefgh"。
long* q = (long*)p 将p强制转换为long*类型,也就是用long类型去解释存储了"abcdefgh"的这一段内存,此时q指向’a’,由于long类型是4个字节,那么q++移动4个字节,q将指向’e’,打印q将得到"efgh"。
20、运行该程序的输出结果是()
int main() {int y=3,x=3,z=1;printf("%d%d\n",(++x, y++), z+2);
}
逗号表达的求值顺序是从左向右以此计算用逗号分隔的各表达式的值,
最后一个表达式的值就是整个逗号表达式的值,所以(++x,y++)的值将是y++,
因为是先输出y的值,再将y增1,所以轴线输出3,再输出Z+2的值,即3;所以应选择D
21、在x86的机器上执行:
int a = 0xabcd1234;
char b = ((char*)&a)[0];
请问b是多少
x86是小端存储,即高位存储在高地址,低位存储在低地址。
int a = 0xabcd1234;
内存中 ab cd 12 34,b作为一个char,右边表达式指针指向为0x34.
高 --> 低
记住小端模式与正常读写顺序相反就够了
22、以下变量的定义,正确的是()
C/C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
23、
main() {int a, b, d = 25;a = d/10%9;b = a && (-1);printf("%d,%d\n", a, b);
}
程序运行后的输出结果是()
a=d/10%9,由于/是除法运算符,%(两边必须是整数)是取余运算符。这两个运算符都是同一优先级,都是左结合,那么就表示d除以10所得到的整数再除以9取余数。
假设d=25,那么a=25/10%9=2%9=2
注意 x%y如果x逻辑与&&运算认为0为假,非0为真
这题考察的是2进制运算和优先级
<<优先级大于|
所以实际运算顺序为 (4<<2) | 3
4 二进制为 100 , 移位<<2 得到 10000 即 16
3 二机制为 011
10000 | 011 或运算得到 10011 即 19
25.执行下面程序时,欲将25和2.5分别赋给a和b,正确的输入方法是()
int a;
float b;
scanf("a=%d,b=%f",&a,&b);
格式控制字符串中出现的常规字符(包括转义字符),务必原样输入。所以正确答案为C。
26.数组a的定义为:int a[3][4]; 下面哪个不能表示 a[1][1] ?
27、下面程序运行的结果是()
#include
void add(int *p){(*p)++;printf("%d", *p);if (*p > 5){return;}add(p);
}
int main(){int i = 0;add(&i);return 0;
}
指针p所指一直没有改变,变得是指针p所指向的值。
p++ :表示先访问p,然后p++;
(p)++: 表示先访问p,然后将*p的值++;p指针不变。
28、下列for循环的循环体执行次数为
for(int i=10, j=1; i=j=0; i++, j--)
i=j=0; 是一个赋值语句,位于for的判断位置,就只当成条件真假,C中0为假,非0为真,所以i=j=0,结果就是i==0,为假,则循环不进入;如果是 i=j=1,结果就是真,可以进入循环,并且无限。
在for(string1;string2;string3)中,string1用于设定循环变量处置,string2用于循环判断,string3用于改变循环变量到调节,一般情况下,我们采用逻辑判断表达式来决定循环是否执行,而如果在这里采用赋值语句,其逻辑值始终为假,导致循环不执行
29、阅读以下程序,当输入数据的形式为25,13,10↙,正确的输出结果为()
int main() {int x, y, z;scanf("%d%d%d", &x, &y, &z);printf ("x+y+z=%d\n", x+y+z);
}
当一次scanf调用需要输入多个数据项时,如果前面数据的输入遇到非法字符,并且输入的非法字符不是格式控制字符串中的常规字符,那么,这种非法输入将影响后面数据的输入,导致数据输入失败。当输入为25,13,10时,a的值是25,y和z的值将无法预测,所以x+y+z的值是无法确定的。故正确答案是D。