C/C++實際遇到的面試題

本人自學C++,現要轉行到IT開發行業,最近面試遇到的一些面試題列在下邊,附答案及剖析。不分先後。

1,判斷下邊這段代碼輸出結果是什麼?

#include <stdio.h>

void main()
{
    unsigned int a=6;
    int b=-20;
    if((a+b)>6)
        printf(">6");
    else
        printf("<=6");

控制檯執行結果爲:

>6

原因剖析:
這道題考察C的自動類型轉換規則:
自動轉換順序
1、若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。
2、轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。

  • a、若兩種類型的字節數不同,轉換成字節數高的類型
  • b、若兩種類型的字節數相同,且一種有符號,一種無符號,則轉換成無符號類型

3、所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。
4、char型和short型參與運算時,必須先轉換成int型。
5、在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換爲左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四捨五入向前舍入。

2,定義MIN宏函數,傳入兩個參數,使其結果爲兩者中較小的一個。

#define MIN(a,b) (((a)<(b))?(a):(b))
//注意,這裏的括號不能省,比如說萬一要運算temp = 3*MIN(x,y);展開後會是怎樣?
//另外,這樣寫會有副作用,比如說least = MIN(x,y[j++]);結果如何?

3,用宏定義一年的秒數。

#define SEC_PER_YEAR (365*24*60*60UL)
//錯誤方法:#define SEC_PER_YEAR(365*24*60*60) 宏定義默認int類型,超過類型存儲範圍了
//#define SEC_PER_YEAR(365*24*60*60)UL 實際測試VS/GCC編譯不通過

4,memcpy與memmove有什麼區別。請手動寫出這兩個函數的實現。

  • memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝N個字節到目標dst所指的內存地址的起始位置中。
  • memmove函數的功能同memcpy基本一致,但是當src區域和dst內存區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝。
    代碼實現:
//memcpy實現:
void* mymemcpy(void* dest, const void* src, size_t count)
{
    assert(dest != NULL||src != NULL);
    char *tmp = (char*)dest;
    char *p = (char*)src;

    while(count--)
    {
        *tmp++ = *p++;
    }
    return dest;
}

你有沒有優化這個memcpy方法的方案?
看大神討論: 如何對memcpy/memset優化

//memmove實現:
void* mymemmove(void* dest, const void* src,size_t count)
{
assert(dest != NULL||src != NULL);

if(dest<src)
{
    //mymemcpy(dest, src, count);
    char *p = (char*)dest;
    char *q = (char*)src;
    while(count--)
    {
        *p++ = *q++;
    }
}
else
{
    char* p = (char*)dest + count;
    char* q = (char*)src + count;
    while(count--)
    {
        *p-- = *q--;    
    }
}
return dest;
}

5,假設有一個整數a,請寫兩段代碼,第一段代碼讓a的第3位置爲1,第二段代碼讓a的第3位清零。

作者對位運算掌握不熟練,雖然現在能給出答案,但是決定等吃透位運算再附上答案,待續.......

6,評價下面的代碼片斷:

unsigned int zero = 0;

unsigned int compzero = 0xFFFF;

/*1's complement of zero */

對於一個 int型不是16位的處理器爲說,上面的代碼是不正確的。應編寫如下:

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