2014年5月16日 星期五

C程式 面試題目整理

面試考題

1 explain #error


   ref1
   ref2
 
   簡單地說:  compiler看到 它 就會停掉啦~
   為什麼要停掉?  ref3


   2. explain "struct" and "union"



   struct → 所佔記憶體空間為 member 相加
   union → 所佔記憶體空間由最大size member決定

   note: 所以union的member同一時間只會最多出現一個
 
   example:

  3. 修飾字 (const, volatile, static......)

explain "volatile" and "const".  can we use "volatile" and "const" in the same variable ? can we use "volatile" in a pointer?
最能幫我理解的就是舉 status register來當例子,如下:

"const volatile is used for defining Hardware Read-only Registers.example CPU status registers.
the value of these registers are read-only but the 
value of these registers may change depend on the processor status.  
Thus const volatile variable can't be altered by the programmer but by the Hardware
" ref

中文版:
  "volatile變數代表其所儲存的內容會不定時地被改變,宣告volatile變數用來告訴編譯器 (Compiler) 不要對該變數做任何最佳化操作,凡牽涉讀取該volatile變數的操作,保證會到該變數的實體位址讀取,而不會讀取CPU暫存器的內容 (提升效能) 。舉個例子,某一硬體狀態暫存器 (Status Register)就必須宣告volatile關鍵字,因為該狀態暫存器會隨時改變,宣告volatile便可確保每次讀取的內容都是最新的"  cited from ref1

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


→ 何時可以用const?
      1 co-work一個function時,有時會用傳參考的方式,但傳參考有點風險(別人可以不懂,就直接改了某個不該改的變數) ,要避免的 你可以給這種 prototype:

             int foo(const int &bar)

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



  幾個用法: (規則 * 和 & 左邊形容指向的值,右邊是本身),for example

  1. const int a=100;  // 沒有*和&,所以簡單: const和int通通是形容a
  2. int const b=100; // 同上
  3. const int *a=&b; // 套規則: * 左邊的const和int是指向的值,所以a指標指向的值不能改,*右邊的是本身,所以a可以改(沒有const和int修飾到它)
  4. int const *a=&b; //同上
  5.  int * const a = &b; //套規則: * 左邊的int是修飾a指向的值,所以,值可以改(因為沒const嘛),*右邊的是本身,已被const修飾到了,所以a不能改
  6. const int * const a = &b; // 也不用套三小規則了啦,都出現兩個const,就通通都不能改了啊!
  7. const int &a=100; ///套規則: & 左邊的int是修飾a指向的值,值可以改(因為沒const嘛),&右邊的是本身所以a可以改(沒有const修飾到它)
    note: 因為被const修飾到的東西未來都不能改了,所以宣告時要初始…不然就沒什用途了…(除非你希望該值是0?)

4. bit operation

example1:

可能是這樣解啦:
1 第四行和第五行 好像可以"約分"一下
→ 第5行會變成: v = (v1&(~v2)) |v2
再變成→ (V1|V2) & ((~V2) | v2)
→ &的右邊是1,所以V 就是V1|V2






example 2
a) #define set_bit(x, nth_bit) x|(1<<nth_bit)
b) #define clear_bit(x, nth_bit) x|(1<<nth_bit)
REF





? 難道要先展開成二進位? 再慢慢算?


5. ??


要考你 a+1 和 &a+1。
第一種的+1一次是跳一個int的大小(i.e., 4bytes in 32-bits cpu)
第二種的+1一次是跳一整個array的大小 (i.e., 4*5=20 bytes)

更清楚的說明在 (see also this), 可以看到: a和&a值雖相同,但type不同。
所以 +1 時,要加的是 type的大小

所以*(a+1)是2,(*p-1)是garbage (unknown value)



答案: typedef void(*pf)(char *);

第一行那坨,眼睛只要看著 void (*)(char *)就好
它是一個function pointer的type

只要記得,function pointer的typedef 是把new type的name塞在第一個*後面

不要像我一開始還寫成:

typedef void(*)(char *) pf




先說:  我還看過規定 + - * /都不能用的。

解法1: 可以利用3的倍數的特性:  每個位數相加起來依舊是3的倍數。
例如: 369是3的倍數,那3+6+9=18也一定是3的倍數。
『每個位數相加』的動作一直做到只剩個位數為止,如上例 18還不是只剩個位數,所以繼續,1+8=9。最後的結果只要是3或6或9 那該數就是3的倍數。




 

    9. explain lvalue and rvalue