面試題總結 – C 語言 – 關鍵字(keywords)

來源:互聯網
上載者:User

1. 關鍵字Static的作用是什嗎?

answer: 這個簡單的問題很少有人能回答完全,在C語言中,關鍵字static 有三個明顯的作用:

1,  在函數體,一個被聲明為靜態變數在這一函數被調用的過程中其值不變。

2, 在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內的所有函數訪問,但不能被模組外地其他函數訪問,因為他是一個本地的全域變數。

3,在模組內,一個被聲明為靜態函數只可被這一模組內的其他函數調用,那即是,這個函數被定義在聲明它的模組的本地範圍內使用。

2. 關鍵字const是什麼含義?

answer: 我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裡完全概括了const的所有用法,因此ESP(譯者:Embedded SystemsProgramming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.
如果你從沒有讀到那篇文章,只要能說出const意味著“唯讀”就可以了。儘管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程式,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:
1). 關鍵字const的作用是為給讀你代**的人傳達非常有用的資訊,實際上,聲明一個參數為常量是為了告訴了使用者這個參數的應用目的。如果你曾花很多時間清 理其它人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式員很少會留下的垃圾讓別人來清理的。)
2). 通過給最佳化器一些附加的資訊,使用關鍵字const也許能產生更緊湊的代**。
3). 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代**修改。簡而言之,這樣可以減少bug的出現。

3. 關鍵字volatile有什麼含意並給出三個不同的例子。

一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,最佳化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在寄存器裡的備份。下面是volatile變數的幾個例子:
1). 平行裝置的硬體寄存器(如:狀態寄存器)
2). 一個中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
3). 多線程應用中被幾個任務共用的變數
回答不出這個問題的人是不會被僱傭的。我認為這是區分C程式員和嵌入式系統程式員的最基本的問題。嵌入式系統程式員經常同硬體、中斷、RTOS等等打交道,所用這些都要求volatile變數。不懂得volatile內容將會帶來災難。
假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。
1). 一個參數既可以是const還可以是volatile嗎?解釋為什麼。
2). 一個指標可以是volatile 嗎?解釋為什麼。
3). 下面的函數有什麼錯誤:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一個例子是唯讀狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。
2). 是的。儘管這並不很常見。一個例子是當一個中服務子程式修該一個指向一個buffer的指標時。
3). 這段代**的有個惡作劇。這段代**的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代**:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代**可能返不是你所期望的平方值!正確的代**如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

位**作(Bit manipulation)

3.

#include<setjmp.h>
static jmp_buf  buf;

main()   
{
  volatile  int b;
  b =3;

  if(setjmp(buf)!=0) 
  {
    printf("%d ", b); 
    exit(0);
  }
  b=5;
  longjmp(buf , 1);
}

請問,這段程式的輸出是
(a) 3
(b) 5
(c) 0
(d) 以上均不是

answer:

volatile字面意思是易於揮發的。這個關鍵字來描述一個變數時,意味著 給該變數賦值(寫入)之後,馬上再讀取,寫入的值與讀取的值可能不一樣,所以說它"容易揮發"的。
這是因為這個變數可能一個寄存器,直接與外部裝置相連,你寫入之後,該寄存器也有可能被外部裝置的寫操作所改變;或者,該變數被一個中斷程式,或另一個進程
改變了.
volatile 不會被編譯器最佳化影響,在longjump 後,它的值 是後面假定的變數值,b最後的值是5,所以5被列印出來.

setjmp : 設定非局部跳轉 /* setjmp.h*/

Stores context information such as register values so that the lomgjmp functioncan return control to the statement following the one calling setjmp.Returns 0when it is initially called.

Lonjjmp: 執行一個非局部跳轉 /* setjmp.h*/

Transfers control to the statement where the call to setjmp (which initializedbuf) was made. Execution continues at this point as if longjmp cannot returnthe value 0.A nonvolatile automatic variable might be changed by a call tolongjmp.When you use setjmp and
longjmp, the only automatic variablesguaranteed to remain valid are those declared volatile.

Note: Test program without volatile qualifier (result may very)

更詳細介紹,請參閱 C語言的setjmp和longjmp

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.