許多人看到這道題目的時候都會嗤之以鼻,覺得非常簡單,於是就寫下下面的**:
if(x==0.0);
if(x!=0.0);
偶爾可能還有個別人,會因為自己注意了寫的是0.0,而不是0而沾沾自喜,不過這樣的寫法均為錯誤的寫法,為什麼呢?因為float的表示方法的問題,float本身就是不精確的,精確度在小數點後6~7位,再往後的就不能保證資料的精確度了。大家可能知道,所有的資料儲存在記憶體中都是以二進位制的方式進行儲存的,首先說一下int型別,
任意的乙個整數,都可以使用 a*2^n+b*2^(n-1)+...x*2^0 來表示。也就是只要空間足夠大,那麼
就可以使用這種方式來表示所有的一切整數數字。
但是對於浮點數來說,在記憶體中使用的是指數冪的形式進行儲存的,跟整數型別是不一樣的。
float是 符號位+8bit的指數為+23bit的小數字組成的。那麼這樣就會有乙個問題,如果資料中的
小數字超過了用來表示小數字的bit長度,就會有資料丟失了,這個時候通常計算機會按照一定的
規律進行轉換得到乙個非常接近的數值,例如13.765432有時候得到的值卻是13.7654319。這就
是所謂的float型別不精確的原因了。
與之相似的,還有這樣一道題目:
等式(a+b)+c==(b+a)+c和
(a+b)+c==(a+c)+b能否成立?
對於這道題目而言,答案也是不能夠成立的,在比較float或double時,不能簡單地比較。由於計
算誤差,相等的概率很低。應判斷兩數之差是否落在區間(-e,e)內。這個e應比浮點數的精度大
乙個數量量級。
除此之外,下面的一道題目也是非常經典的面試題:
寫出bool,int,float指標變數與零值比較的if語句
//bool型資料
if(flag);
if(!flag);
//int型資料
if(0!=flag);
if(0==flag);
//指標型資料
if(null==flag);
if(null!=flag);
//float型資料
define norm 0.00001;
if(flag>= -norm && falg<=norm);
這里需要注意的就是在
int,指標型變數和零值比較的時候,把零值放在左邊,這樣當把
==誤寫成
=時,編譯器
器可以報錯,否則這樣邏輯錯誤不容
易發現,並且可能導致很嚴重的後果
的面試題 C語言面試題總結
下面是我在軟通動力的一些面試題,雖然有些模糊了,但是都還是在面試中經常會看到的一些題,而且通過我面試的這些題,也總結了一些面試經驗,這些都是面試時你必須要做好的。首先看面試題吧。1,寫乙個單鏈表,儲存1,2,3,然後寫乙個函式讓其記憶體反轉,3,2,1。2,忘了 3,c字串,this is a te...
C語言面試題之華為面試題
1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...
C語言面試題
基礎篇 1 區域性變數能否和全域性變數重名?可以2 如何引用乙個已經定義過的全域性變數?直接呼叫並初始化 3 全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?可以,6 堆和棧有什麼區別?7 什麼是預編譯,何時需要預編譯 8 c和c 中的struct有什麼不同?9 memset me...