1、下列程序段的功能是判断字符串是否对称,对称返回1,不对称返回0,请将缺失处处缺失程序补充完整。
1
2
3
4
5
6
bool
fun(string str) {
int
i=0,j=0;
j = ____;
for
(j--; i < j && str[i]==str[j]; i++, j--);
return
i >= j;
}
A、i+1
B、i
C、strlen(str)
D、str.size()
答案:D
解析:根据题目给出的功能描述,结合当前给出的代码,得出str[j]初始应该在字符串的末尾,所以j大小应该等于字符串的长度,首先排除选项A和选项D。C选项中使用了strlen()函数,但strlen是 C 语言中用于计算字符串长度的函数,根据代码中的字符串类型发现代码是用 C++ 编写的。在 C++ 中,应使用std::string类的成员函数size()来获取字符串的长度。所以选项C错误,选项D正确。
2、 下列函数定义中,有语法错误的是()
A、void fun(int x, int y){x = *y;}
B、int * fun(int *x, int y){return x += y;}
C、void fun(int *x, int y){*x += y;}
D、void fun(int x, int y){*x = *y;}
答案:AD
解析:选项A中传入参数为两个整数变量,*y是不合法的,错误。选项D中也是同选项A一样的问题,错误。选项B想表达的意思可能是指针的偏移,选项C操作是在把指针x指向的目标加上y。
3、 设有语句
1
2
int
a = 5, b;
b = a > 3 && 0, a++;
执行后变量 b 的值为__________()
A、5
B、6
C、0
D、1
答案:C
解析:让我们来分析一下第二行代码的执行过程,首先执行判断a>3结果为ture,执行ture&&0结果为0,执行b=0,最后执行a++,但并不会将这个值赋给任何变量。最后b的值为0,选择选项C。
4、 以下逗号表达式的值为()
1
(x=4*5, x*5), x+25
A、25
B、20
C、100
D、45
答案:D
解析:根据运算符的优先级,()的优先级最高,在括号中会先计算4*5并把它赋给x,所以x现在为20。然后计算x*5为100,作为整个括号的返回值,但它没有被任何变量接收。所以最后计算x+25时还是20+25,结果是45,选择选项D。
5、假设编译器规定int 和 short 类型长度分别为 32 位和 16 位,若有下列 C 语言语句:
1
2
unsigned
short
x = 65530;
unsigned
int
y = x;
得到y 的机器数为( )。
A、0000 7FFAH
B、0000 FFFAH
C、FFFF 7FFAH
D、FFFF FFFAH
答案:B
解析:已知一个无符号短整型变量x,结合它类型长度为16位,所以它可以存的最大的数为65535,这里赋值一个65530,无溢出。65530的二进制表示为1111 1111 1111 1010,将其赋给一个无符号的整型变量y,前面要补16个零,所以y的机器码为0000 FFFAH(H代表十六进制),选择选项B。
6、下面的类型声明中正确是()
A、int & a[4];
B、int &=p;
C、int &&q;
D、int i,*p=&i;
答案:D
解析:C++中不能建立引用数组、指向引用的指针、引用的引用。所以选项ABC错误,选项D正确。
7、 以下程序段的输出结果是()
1
2
char
s[] =
"\\141\141abc\t"
;
printf
(
"%d\n"
,
strlen
(s));
A、9
B、12
C、13
D、14
答案:A
解析:"\\141\141abc\t",前两个\\标志一个反斜杠字符,长度为1,141是三个字符,长度为3,\141中\将后面连续三个数字转为八进制,长度为1,abc是三个字符,长度为3,\t是水平制表符,长度为1。综上,总的有效长度为9,选择选项A。
8、 有以下程序
1
2
3
4
5
main() {
char
*a =
"How are you?"
, b[20];
______________________________
printf
(
"%s %s\n"
, a, b);
}
请为横线处选择适当的输入语句使得( )
程序运行时从键盘输入:How are you?<回车>
得到的输出结果为How are you? HowA、gets(b);
B、scanf("%s", b);
C、b=getchar();
D、while(b=getchar()!="\0");
答案:B
解析:本题考查的是,scanf的接收终止条件,scanf遇到输入中的空格、回车、tab、特殊字符会终止接收。所以题目中使用scanf输入时,输入到How和空格后,就停止接收了。所以本题选择选项B。
9、 int i,j,a[2][3];按照数组a的元素在内存的排列次序,不能将数1、2、3、4、5、6存入a数组的是( )
A、for(i=0;i<2;i++)for(j=0;j<3;j++)a[i][j]=i*3+j+1;
B、for(i=0;i<3;i++)for(j=0;j<2;j++)a[j][i]=j*3+i+1;
C、for(i=0;i<6;i++)a[i/3][i%3]=i+1;
D、for(i=1;i<=6;i++)a[i][i]=i;
答案:D
解析:本题很好得出答案为D,选项D中循环到后面已经在越界存储了。记录一下的原因是觉得选项C这种存入方法很巧妙。
10、char * const p, char const * p, const char *p 上述三个的区别,说法错误的是?
A、char * const p; p的值不可以修改
B、char const * p;p指向的值为只读
C、const char *p;p的值不可以改变
答案:C
解析:根据const的位置区分是常量化指针还是常量化指针目标,一个小技巧就是看const右面只有p还是有*p。如果const右边只有p,如选项A,证明是常量化指针,所以指针的值不可以修改(即指针的指向不可以修改)。如果const右边有*p,如选项C,证明是常量化指针目标,则不能通过指针来修改指针目标的值。所以本题选择选项C。