1. 程式人生 > >C、C++工程師面試題

C、C++工程師面試題

題目:

要求:將數a、b的值進行交換,並且不使用任何中間變數。

程式如下:

[cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include<stdio.h>
  2. void swapValue1(int &a, int &b) //使用中間變數交換資料
  3. {  
  4.     int temp = a;  
  5.     a = b;  
  6.     b = temp;  
  7. }  
  8. void swapValue2(int &a, int &b)//使用加減運算完成資料交換
  9. {  
  10.     a = a + b;  
  11.     b = a - b;  
  12.     a = a - b;    
  13. }  
  14. void swapValue3(int &a, int &b) //使用位運算交換資料
  15. {  
  16.     a^=b;  
  17.     b^=a;  
  18.     a^=b;  
  19. }  
  20. int main()  
  21. {  
  22.     int a1 = 1, b1 = 2;  
  23.     int a2 = 3, b2 = 4;  
  24.     int a3 = 5, b3 = 6;  
  25.     swapValue1(a1, b1);  
  26.     swapValue2(a2, b2);  
  27.     swapValue3(a3, b3);  
  28.     printf("a= %d  b= %d\n",a1, b1);  
  29.     printf("a= %d  b= %d\n",a2, b2);  
  30.     printf("a= %d  b= %d\n",a3, b3);  
  31.     return 0;  
  32. }   

執行結果:


解析:

第一種:

使用中間變數來達到交換資料的目的,這是最大眾的方法,當然了不滿足本題的要求。

第二種:

使用簡單的加減操作來達到交換a、b值得目的。

缺點:a+b和a-b時,可能會到導致資料溢位。

第三種:

採用位運算的方法,按位異或運算。(建議採用這種方式)

異或運算:相同的二進位制位異或運算為0,不相同的二進位制位異或運算為1。

初次從面試寶典中看到這個問題,我那也是一臉的懵逼啊。老師一直告訴我們,main是函式的入口地址,執行完成後,就返回作業系統了。殊不知還有這麼多沒了解過的知識。

題目:

main()函式執行完後,還會呼叫執行其他的語句嗎?

       我們通常認為C語言的起始函式是main()函式,實質上一個程式的啟動函式並不一定是main()函式,這個可以採用連結器來設定,但是gcc中預設main()就是C語言的入口函式,在main函式啟動之前,核心會呼叫一個特殊的啟動例程,這個啟動例程從核心中取得命令列引數值和環境變數值,為呼叫main()函式做好準備。

      因此對應程式而言main()函式並不是起始,但是對應C 語言而言,main()函式就是入口地址。

      按照ISO C的規定,一個程序可以登記多達32個函式,這些函式將由exit自動呼叫,通常這32個函式被稱為終止處理程式,並呼叫atexit()函式來登記這些函式。 (函式的呼叫順序與註冊的順序是相反的,通過下面的例項可以看出來)     

舉例

程式碼如下:

[cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void fun1(void)  
  4. {  
  5.     printf("fun1\n");  
  6. }  
  7. void fun2(void)  
  8. {  
  9.     printf("fun2\n");     
  10. }  
  11. void fun3(void)  
  12. {  
  13.     printf("fun3\n");  
  14. }  
  15. int main()  
  16. {  
  17.     atexit(fun1);  
  18.     atexit(fun2);  
  19.     atexit(fun3);  
  20.     printf("main exit\n");  
  21.     return 0;  
  22. }   

執行結果:


函式說明:

標頭檔案:#include <stdlib.h>

定義函式:int atexit (void (*function) (void));

atexit()用來設定一個程式正常結束前呼叫的函式. 當程式通過呼叫exit()或從main()中返回時, 引數function 所指定的函式會先被呼叫, 然後才真正由exit()結束程式。