C/C++錯題集整理(一)

1、以下數字在表示爲double(8字節的雙精度浮點數)時存在舍入誤差的有()。

A.的平方根   B.10的30次方     C.0.1    D.0.5

解析:ABC  A超出了double型能表示的最大界限。小數點後的位權應該是2的負數次方纔沒有誤差,其他情況都有誤差,即小數點後的第一位位權應該爲2的-1次,即0.5,第二位也就是2的-2次,即0.25

2、以下程序輸出結果是——()

class A
{
public:
virtual void func(int val = 1)
{
std::cout << "A->" << val << std::endl;
}
virtual void test()
{
func();
}
};
class B : public A
{
public:
void func(int val = 0)
{
std::cout << "B->" << val << std::endl;
}
};
int main(int argc, char* argv[])
{
B*p = new B;
p->test();
return 0;
}

解析:B->1 

絕不重新定義繼承而來的缺省參數值!

1
2
3
B*p = newB;
 
p->test();
p->test()執行過程如下
       (1) 由於B類中沒有覆蓋(重寫)基類中的虛函數test(),因此會調用基類A中的test()
       (2) A中test()函數中繼續調用虛函數 fun(),因爲虛函數執行動態綁定,p此時的動態類型(即目前所指對象的類型)爲B*,因此此時調用虛函數fun()時,執行的是B類中的fun();所以先輸出“B->”;
       (3) 缺省參數值是靜態綁定,即此時val的值使用的是基類A中的缺省參數值,其值在編譯階段已經綁定,值爲1,所以輸出“1”;
       最終輸出“B->1”。切記:絕不重新定義繼承而來的缺省參數值!

3、一個C語言源程序是由函數組成。
4、JAVA不使用指針,不支持頭文件,不支持宏定義,JAVA可以動態分配內存;C++比較適合一些底層處理,JAVA比較適合開發應用,可以是WEB,也可以是手機端的Android。
5、程序的開發過程:編輯、編譯預處理、編譯、連接、運行。
6、判斷字符串 s1 是否大於字符串 s2,應當使用if (strcmp(s1, s2)>0),要是if (strcmp(s1, s2))的話,如果是小於的話,就是if(-1),這時候還是判斷爲真的,所以得用>0來表示大於。
若s1==s2,則返回零;
若s1<s2,則返回負數;
若s1>s2,則返回正數
7、重載運算符保持原運算符的優先級和結合性不變。

運算符重載時要遵循以下規則:

 ( 1 ) 除了類屬關係運算符 " . " 、成員指針運算符 " .* " 、作用域運算符 " :: " 、sizeof運算符和三目運算符 " ?: " 以外,C ++ 中的所有運算符都可以重載。
 
(
 2 ) 重載運算符限制在C ++ 語言中已有的運算符範圍內的允許重載的運算符之中,不能創建新的運算符。
 
(
 3 ) 運算符重載實質上是函數重載,因此編譯程序對運算符重載的選擇,遵循函數重載的選擇原則。
 
(
 4 ) 重載之後的運算符不能改變運算符的優先級和結合性,也不能改變運算符操作數的個數及語法結構。
 
(
 5 ) 運算符重載不能改變該運算符用於內部類型對象的含義。它只能和用戶自定義類型的對象一起使用,或者用於用戶自定義類型的對象和內部類型的對象混合使用時。
 
(
 6 ) 運算符重載是針對新類型數據的實際需要對原有運算符進行的適當的改造,重載的功能應當與原有功能相類似,避免沒有目的地使用重載運算符。
8、要想使語句cout<<STR 顯示 Hello!,STR 不可定義爲()。
A.char STR[] = "Hello!" B.char STR[6] = "Hello!" C.char *STR="Hello!" D.#define STR "Hello!"

解析:B 
char STR[] = "Hello!";
有六個字符, cout << sizeof(STR); 的結果是7,因爲後面還有一個結束符 "\0"
9、
下面的程序段()
注:第行程序前的數字爲行號
/*1*/void main()
/*2*/{
/*3*/float a[10]={0.0};
/*4*/int i;
/*5*/for(i = 0; i < 3; i++) scanf("%d", &a[i]);
/*6*/for(i = 0; i < 10; i++) a[0] = a[0] + a[i];
/*7*/printf("%f\n", a[0]);
/*8*/}
解析:第5行有錯誤。
若爲/*5*/for(i = 0; i < 3; i++) scanf("% f ", &a[i]);就對了。
%f是單精度浮點數的格式,%lf是雙精度浮點數格式。
%d整形。
10、對每個可重載的運算符來講,它既可以重載爲友元函數,又可以重載爲成員函數,還可以重載爲非成員函數。
解析:錯誤。某些運算符必須重載位成員函數,比如  operator new;
某些運算符必須重載爲非成員函數,比如  operator >>...
11、聲明枚舉的三種方法

聲明枚舉變量三種方法

1、先聲明枚舉類型後定義枚舉類型變量

enum WeekdayType  
{  
    sun,mou,tue,wed,thu,fri,sat  
};  
enum WeekdayType today,yesterday,tomorrow;

2、聲明枚舉類型的同時定義枚舉類型變量

enum WeekdayType  
{  
    sun,mou,tue,wed,thu,fri,sat   
}today,yesterday,tomorrow;

3、直接定義枚舉類型變量

enum  
{  
    sun,mou,tue,wed,thu,fri,sat  
}today,yesterday,tomorrow;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章