錯題集
1.有如下程序段:
#include "stdio.h”
class A
{
public:
int _a;
A()
{
_a = 1;
}
void print()
{
printf("%d", _a);
}
};
class B: public A
{
public:
int _a;
B()
{
_a = 2;
}
};
int main()
{
B b;
b.print();
printf("%d", b._a);
}
請問程序輸出:
答案:12
解析: 因爲在繼承的時候,允許子類存在與父類同名的成員變量,但是並不覆蓋父類的成員變量,他們同時存在。 因爲給孩子類中沒有定義print函數,所以會按照就近原則去尋找父類中是否有print函數。恰好父類中有這個函數,於是調用父類的print函數b.print(),而這個函數會調用父類的a變量。
2.以下程序段的輸出結果是()
char str[] = "ab\012\\n";
printf("%d", strlen(str));
答案:5
解析:
3.若執行以下程序段
int x=3,y=6,z; z=x^y<<2;
則z的二進制值是_______________
答案:00011011
解析:運算符優先級,左移<<優先級較高,先計算y<<2.
4.以下程序的打印結果是()
1.#include<iostream>
2.using namespace std;
3.
4.void swap_int(int a , int b)
5.{
6. int temp = a;
7. a = b;
8. b = temp;
9.}
10.
11.void swap_str(char*a , char*b)
12.{
13. char*temp = a;
14. a = b;
15. b = temp;
16.}
17.
18.int main(void)
19.{
20. int a = 10;
21. int b = 5;
22. char*str_a = "hello world";
23. char*str_b = "world hello";
24. swap_int(a , b);.
25. swap_str(str_a , str_b);
26. printf("%d %d %s %s\n",a,b,str_a,str_b);
27.
28. return 0;
29.}
答案:10 5 hello world world hello
解析:swap_int(a, b)將實參10,5傳遞給了形參,在被調用函數中交換了10和5,但是調用結束,函數釋放變量,實參中並沒有交換;
swap_str(str_a, str_b)將實參的地址傳遞給了形參,其實跟上面的類似,並沒有改變實參str_a、str_b的指向,實參沒有交換。
5.int FindSubString( char* pch )
{
int count = 0;
char * p1 = pch;
while ( *p1 != '\0' )
{
if ( *p1 == p1[1] - 1 )
{
p1++;
count++;
}else {
break;
}
}
int count2 = count;
while ( *p1 != '\0' )
{
if ( *p1 == p1[1] + 1 )
{
p1++;
count2--;
}else {
break;
}
}
if ( count2 == 0 )
return(count);
return(0);
}
void ModifyString( char* pText )
{
char * p1 = pText;
char * p2 = p1;
while ( *p1 != '\0' )
{
int count = FindSubString( p1 );
if ( count > 0 )
{
*p2++ = *p1;
sprintf( p2, "%i", count );
while ( *p2 != '\0' )
{
p2++;
}
p1 += count + count + 1;
}else {
*p2++ = *p1++;
}
}
}
void main( void )
{
char text[32] = "XYBCDCBABABA";
ModifyString( text );
printf( text );
}
答案:XYBCDCBA1BAA
解析:FindSubString() 函數就是要找到一個先遞增再遞減且遞增和遞減的數量相等的迴文序列,例如: ABCDCBA ,先是 後一項 = 前一項 ASCII 碼 +1 , 後是 後一項 = 前一項 ASCII 碼 -1 ,才能返回迴文子串的長度,否則返回 0 。
ModifyString() 函數不斷尋找上述類型的子串,如果不滿足條件,就
*p2++ = *p1++;
當遇到 ABABA 中前一個 ABA 的時候,滿足迴文子串要求,此時 p1 指向 A BABA , p2 指向 ABABA ; sprintf 重定向修改 ABABA , B 變爲 1 ,且跟隨一個 ‘\0’ (該函數自動產生的) , 此時,字符串變爲 A1‘\0’BA 。
經過 while ( *p2 != '\0' ) 循環之後, p2 指向 A1‘\0’BA , p1 += count + count + 1 之後, p1 指向 A1‘\0’BA 。此時字符串已經被改動,之前的 ABABA 已經不存在,變爲 A1‘\0’BA 。
再次進入 while ( *p1 != '\0' ) 循環之後,只能執行 else 部分的命令, p1 指向 p2 指向的元素的後一個,不斷將 p1 指向的元素傳給 p2 所指向的位置,將原數據覆蓋。所以, A1‘\0’BA ,依次變爲 A1BBA 、 A1BAA 。即最終結果爲 XYBCDCBA1BAA 。