本人自學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;