C++/C 程序員要掌握的問題集錦之二


------------------------------------------------------------------------------------------

Q:是不是一個父類寫了一個virtual函數,如果子類覆蓋它的函數不加virtual,也能實現多態?

A:
virtual修飾符會被隱形繼承的。virtual可加可不加,子類的空間裏面有父類的所有變量(static除外),同一個函數只存在一個實體(inline除外),子類覆蓋它的函數不加virtual,也能實現多態。

------------------------------------------------------------------------------------------

Q:輸入一個字符串,將其逆序後輸出。(使用C++,不建議用僞碼)

A:
#include <iostream>
#include <string>

using namespace std;

int main()
{
 char * src = "hello world";
 int len = 0;
 char * dest = new char;

 while( *src++ != NULL )
 {
  cout<<*(src-1);
 }
 src -= 2;
 cout<<endl;
 
 while( *src-- != NULL )
 {
  *dest = *(src+1);
  cout<<*dest;
  *dest++;
 }
 cout<<endl;

 return 0;
}

------------------------------------------------------------------------------------------

Q:寫出程序結果:
void Func(char str[100])
{
  printf("%d/n", sizeof(str));
}

A: 4
分析: 指針長度

------------------------------------------------------------------------------------------

Q:請簡單描述Windows內存管理的方法?

A:windows內存管理主要處理兩件事情:
一.把那些不常用的程序片段放入虛擬內存,當需要用到的時候load入主存中。
二.計算程序片段在主存的物理位置,以便cpu調用。
內存管理分爲塊式管理,頁式管理,段式管理,段頁式管理。
塊式管理:把主存分爲一大塊,一大塊的,當所需的程序片段不在主存時,就分配一塊主存空間,把程序片段load入主存,就算所需的程序片段只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的內存空間,但是易於管理。
頁式管理:把主存分成一頁一頁的 ,每一頁的空間要比一塊一塊的空間小得很多,顯然這種方法空間的利用率要比塊式管理高效很多。
段式管理:把主存分成一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁面管理高很多,但是也存在一個缺點。一個程序片段可能會被分成十幾段,這樣會浪費很多時間在計算每一段物理地址上。
段頁式管理:結合了段式管理和頁式管理的優點。把主存分爲若干頁,每一頁又分成若干段,這樣做不但使得空間的利用率高效,而且在訪問物理地址上速度也會提升。

------------------------------------------------------------------------------------------

Q:用C寫一個輸入的整數,倒着輸出整數的函數,要求用遞歸方法?

A:
#include <iostream>
#include <string>

using namespace std;

void fun(int a)
{
 cout<<a%10;
 a /= 10;
 if(a <= 0)
  return;
 fun( a );
}

int main()
{
 int input_data;
 cout<<"請輸入一個整數: ";
 cin>>input_data;
 fun(input_data);
 return 0;
}

------------------------------------------------------------------------------------------

Q:以下程序輸出的結果是什麼?

#include "stdafx.h"

#define SQR(X) X*X

int main(int argc, char* argv[])
{
 int a = 10;
 int k = 2;
 int m = 1;
 a /= SQR(k+m)/SQR(k+m);
 printf("%d/n",a);
 return 0;
}

A: 1
解釋:
  SQR(k+m)/SQR(k+m)
  = k+m*k+m / k+m*k+m
  = 2+1*2+1/2+1*2+1
  = 2+2+0+2+1
  = 7
a = a / 7 = 1

------------------------------------------------------------------------------------------

Q:const 符號常量;
(1)const char *p
(2)char const *p
(3)char * const p
(4)const char * const p
說明上面四種描述的區別;

A:
(1)const char *p 是指向字符型常量的指針,該指針指向的值不能變,但指針可以指向其他變量。
(2)char const *p 是指向字符型常量的指針,該指針指向的值不能變,但指針可以指向其他變量。
(3)char * const p 是指向字符型的常量指針,該指針指向的值可以改變,但是指針不能指向其他變量。
(4)const char * const p 是指向字符型常量的常量指針,該指針指向的值不能改變,指針不能指向其他變量。

可以這樣記:  
const 在*之"前"表示內容不變  
const 在*之"後"表示指針不變

------------------------------------------------------------------------------------------

Q:下面是C語言中兩種if語句判斷方式。請問哪種寫法更好?爲什麼?
int n;
if (n == 10) // 第一種判斷方式
if (10 == n) // 第二種判斷方式

A:第二種
如果少了一個"=",編譯器會檢測出錯誤,如果是第一種,編譯器不會提示錯誤。

------------------------------------------------------------------------------------------

Q:下面的代碼有什麼問題?
void DoSomeThing(...)
{
 char* p;
 ...
 p = malloc(1024);  // 分配1K的空間
 if (NULL == p)
 return;
 ...
 p = realloc(p, 2048); // 空間不夠,重新分配到2K
 if (NULL == p)
 return;
 ...
}

A:
p = malloc(1024); 應該寫成:p = (char *) malloc(1024);
char * p = NULL; 要初始化。
“棧內存”的指針在return結束的時候自動消亡,但是並不意味着釋放了P的內存空間,容易造成內存泄漏。

------------------------------------------------------------------------------------------

Q:請填寫BOOL,float,指針變量與“零值”比較的if語句。
提示:這裏“零值”可以是0,0.0,false或者“空指針”。例如int變量n與“零值”比較的if語句爲:
if( n == 0 )
if( n != 0 )
以此類推。
請寫出BOOL flag與“零值”比較的if語句:
請寫出float x與“零值”比較的if語句:
請寫出char *p與“零值”比較的if語句:

A:
請寫出BOOL flag與“零值”比較的if語句:
if( flag )
if( !flag )

如下寫法均屬不良風格,不得分
if( flag == true )
if( flag == 1 )
if( flag == false )
if( flag == 0 )

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

請寫出float x與“零值”比較的if語句:
const float epsinon = 0.00001
if(( x >= -epsinon )&&( x <= epsinon ))

如下是錯誤的寫法,不得分
if( x == 0.0 )
if( x != 0.0 )

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

請寫出char *p與“零值”比較的if語句:
if( p == NULL )
if( p != NULL )

如下寫法均屬不良風格,不得分
if( p == 0 )
if( p != 0 )
if(p)
if(!)

------------------------------------------------------------------------------------------

Q:以下爲windows NT下的32位C++程序,請計算sizeof的值。
char str[] = "Hello";
char *p = str;
int n =10;
請計算
sizeof(str) =
sizeof(p) =
sizeof(n) =

void Func(char str[100])
{
請計算
 sizeof(str) =
}

void *p = malloc(100);
請計算
sizeof(p) =

A:
char str[] = "Hello";
char *p = str;
int n =10;
請計算
sizeof(str) = 6;
sizeof(p) = 4;
sizeof(n) = 4;

void Func(char str[100])
{
請計算
 sizeof(str) = 4;
}

void *p = malloc(100);
請計算
sizeof(p) = 4;

------------------------------------------------------------------------------------------

Q:頭文件中的ifdef/define/endif幹什麼用?

A:預編譯指令,防止該頭文件被重複引用。

------------------------------------------------------------------------------------------

Q:#include <filename.h> 和 #include "filename.h" 有什麼區別?

A:
對於#include <filename.h>,編譯器從標準庫路徑開始搜索filename.h。
對於#include "filename.h" ,編譯器從用戶的工作路徑開始搜索filename.h。

------------------------------------------------------------------------------------------

Q:const有什麼用途?(請至少說明兩種)

A:
1.可以定義const常量。
2.const可以修飾函數的參數,返回值,甚至函數的定義體。被const修飾的東西都受到強烈的保護,可以預防意外的變動,能提高程序的健壯性。

------------------------------------------------------------------------------------------

Q:在C++程序中調用被C編譯器編譯後的函數,爲什麼要加extern"C"聲明?

A:
C++語言支持函數重載,C語言不支持函數重載。函數被C++編譯後在庫中的名字與C語言的不同。
假設某個函數函數的原型爲:void foo(int x, int y);
該函數在C編譯器編譯後的庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字。
C++提供了C連接交換指定符號extern"C"來解決名字匹配問題。

------------------------------------------------------------------------------------------

 

Q:寫出運行結果:
int main()
{
    char str[] = "world"; cout << sizeof(str) << ": ";
    char *p    = str;     cout << sizeof(p) << ": ";
    char i     = 10;      cout << sizeof(i) << ": ";
    void *pp   = malloc(10);  cout << sizeof(p) << endl;
}

 

A:
char str[] = "world"; cout << sizeof(str) << ": ";       6
char *p    = str;     cout << sizeof(p) << ": ";         4
char i     = 10;      cout << sizeof(i) << ": ";         1
void *pp   = malloc(10);  cout << sizeof(p) << endl;     4

------------------------------------------------------------------------------------------


發佈了17 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章