1. 程式人生 > >[科技部與你共成長] 幾道語言題

[科技部與你共成長] 幾道語言題

試題1:分別給出BOOLintfloat,指標變數與零值比較的 if 語句(假設變數名為var

試題2:以下為Windows NT下的32C++程式,請計算sizeof的值

void Func ( char str[100] )
{
 sizeof( str ) = ?
}

void *p = malloc( 100 );
sizeof ( p ) = ?

試題3:寫一個標準巨集MIN,這個巨集輸入兩個引數並返回較小的一個。另外,當你寫下面的程式碼時會發生什麼事?

least = MIN(*p++, b);

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

答案:

試題1:分別給出BOOL,int,float,指標變數 與“零值”比較的 if 語句(假設變數名為var)

  解答:

   BOOL型變數:if(!var)

   int型變數: if(var==0)

   float型變數:

   const float EPSINON = 0.00001;

   if ((x >= - EPSINON) && (x <= EPSINON)

   指標變數:  if(var==NULL)

  剖析:

  考查對0值判斷的“內功”,BOOL型變數的0判斷完全可以寫成if(var==0),而int型變數也可以寫成if(!var),指標變數的判斷也可以寫成if(!var),上述寫法雖然程式都能正確執行,但是未能清晰地表達程式的意思。 
 一般的,如果想讓if判斷一個變數的“真”、“假”,應直接使用if(var)、if(!var),表明其為“邏輯”判斷;如果用if判斷一個數值型變數(short、int、long等),應該用if(var==0),表明是與0進行“數值”上的比較;而判斷指標則適宜用if(var==NULL),這是一種很好的程式設計習慣。

  浮點型變數並不精確,所以不可將float變數用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。如果寫成if (x == 0.0),則判為錯,得0分。

  試題2:以下為Windows NT下的32位C++程式,請計算sizeof的值

void Func ( char str[100] )
{
 sizeof( str ) = ?
}

void *p = malloc( 100 );
sizeof ( p ) = ?
  解答:

sizeof( str ) = 4
sizeof ( p ) = 4
  剖析:

  Func ( char str[100] )函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是一個指標;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。

試題3:寫一個“標準”巨集MIN,這個巨集輸入兩個引數並返回較小的一個。另外,當你寫下面的程式碼時會發生什麼事?

least = MIN(*p++, b);
  解答:

#define MIN(A,B) ((A) <= (B) ? (A) : (B))
  MIN(*p++, b)會產生巨集的副作用

  剖析:

  這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終歸不是函式,而巨集定義中括弧中的“引數”也不是真的引數,在巨集展開的時候對“引數”進行的是一對一的替換。