C、C++工程師面試題
題目:
要求:將數a、b的值進行交換,並且不使用任何中間變數。
程式如下:
[cpp] view plain copy print?- #include<stdio.h>
- void swapValue1(int &a, int &b) //使用中間變數交換資料
- {
- int temp = a;
- a = b;
- b = temp;
- }
- void swapValue2(int &a, int &b)//使用加減運算完成資料交換
- {
- a = a + b;
- b = a - b;
-
a = a - b;
- }
- void swapValue3(int &a, int &b) //使用位運算交換資料
- {
- a^=b;
- b^=a;
- a^=b;
- }
- int main()
- {
- int a1 = 1, b1 = 2;
- int a2 = 3, b2 = 4;
- int a3 = 5, b3 = 6;
- swapValue1(a1, b1);
- swapValue2(a2, b2);
- swapValue3(a3, b3);
-
printf("a= %d b= %d\n",a1, b1);
- printf("a= %d b= %d\n",a2, b2);
- printf("a= %d b= %d\n",a3, b3);
- return 0;
- }
執行結果:
解析:
第一種:
使用中間變數來達到交換資料的目的,這是最大眾的方法,當然了不滿足本題的要求。
第二種:
使用簡單的加減操作來達到交換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?- #include<stdio.h>
- #include<stdlib.h>
- void fun1(void)
- {
- printf("fun1\n");
- }
- void fun2(void)
- {
- printf("fun2\n");
- }
- void fun3(void)
- {
- printf("fun3\n");
- }
- int main()
- {
- atexit(fun1);
- atexit(fun2);
- atexit(fun3);
- printf("main exit\n");
- return 0;
- }
執行結果:
函式說明:
標頭檔案:#include <stdlib.h>
定義函式:int atexit (void (*function) (void));
atexit()用來設定一個程式正常結束前呼叫的函式. 當程式通過呼叫exit()或從main()中返回時, 引數function 所指定的函式會先被呼叫, 然後才真正由exit()結束程式。