程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 程序員筆試常見問題易錯點,持續更行中!!!

程序員筆試常見問題易錯點,持續更行中!!!

編輯:關於C語言

1、for語句的執行順序

for(sta1;sta2;sta3)
{
sta4;
}
1.進入循環執行sta1;//只是進入的時候執行.
2.執行sta2;//條件為真才執行sta4,不然就跳出for了.
3,執行sta4;
4,執行sta3;

5,再回到第2步開始執行

2、對於 A&&B,

當A為真時,執行B,當A為假時,不會執行B,直接得出結果 假

3、從 C 文件到 匯編 反編譯:

從 C 到匯編 反編譯 : gcc -s  文件.c       出匯編

4、printf 的規則是從右至左一次壓棧,從右至左進行計算:

例:

#include <stdio.h>

main()

{

       int b = 3;

       int arr[] = {6,7,8,9,10 };

       int *ptr = arr;

       *(ptr++) += 123;

       printf("%d,%d\n",*ptr,*(++ptr));

}

結果為:8,8

5、C++中的 int與unsight int區別

  1. intmain()

  2. {

  3. inta = -6;

  4. unsigned intb = 4;

  5. if(a+b > 0)

  6. cout<<"a+b>0"<<endl;//這句話被打印

  7. else

  8. cout<<"a+b<0"<<endl;

  9. intz = a+b;

  10. if(z > 0)

  11. cout<<"z>0"<<endl;

  12. else

  13. cout<<"z<0"<<endl;//這句話被打印

  14. return 0;

  15. }  

  16. 下面解釋一下原因:當int和unsigned in相加時,要將int轉化為unsigned int,而int小於0,所以它的最高位是符號位,為1,所以轉化的結果是一個很大的正數,在第一個if語句中,是兩個“正數”相加,結果自然就大於0了。而在z = a+b這一句時,它把a+b的結果看做一個int類型,而a+b最高位為1,所以z是一個負數,所以打印的是第二個語句。

6、EAX寄存器

EAX—EDX可稱為數據寄存器,你除了直接訪問外,還可分別對其高十六位和低十六位進行訪問。它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進行八位訪問,也就是說,AX還可以再進行分解,即AX還可分為AH高八位)AL低八位)。

故:在計算過程中,數字暫時存儲在EAX中的位數為16,在對該數字取反時,注意要考慮到原數字前面的0,取反之後為1。

7、指針變量占用內存的大小(字節數).

在32位機上,所有指針類型變量占用內存字節數都為4
因為32位機就是 4字節 * 8個二進制位/字節 計算出來的.
如果在64位機上,指針占用內存大小就是:

8個字節.

8、數組做 sizeof 的參數不退化,傳遞給 strlen 就退化為指針了

數組有指針的特牲, 也有數組的特殊特牲-- 編譯期長度已知

做 sizeof 的參數運用了編譯期長度已知的特牲, 仍然是數組, 沒有退化
傳遞給 strlen 就沒有運用數組的特殊特牲, 行為與指針完全一樣, 退化為指針了

9、sizeof(string)

   關於sizeof(string),今天看那本面試寶典的時候看到這個表達式,有點吃驚,書上寫著sizeof(string)=4;當時很納悶,難道分配4個字節大小的內存給string嗎?查閱了相關資料得出結論:string的實現在各庫中可能有所不同,但是在同一庫中相同一點是,無論你的string裡放多長的字符串,它的sizeof()都是固定的,字符串所占的空間是從堆中動態分配的,與sizeof()無關。  
     sizeof(string)=4可能是最典型的實現之一,不過也有sizeof()為12、32字節的庫實現。 但是VC6.0測試後sizeof(string)=16.還是跟編譯器有關


10、在寶典77頁有這個題目解析如下:

是關於數組與指針的問題,描述如下:

main()

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

}

輸出為:2,5

請解釋以上代碼的輸出結果。

答案如下:

*(a+1)其實很簡單就是指a[1],輸出為2.

問題關鍵就在於第二個點,*(ptr-1)輸出為多少?

解釋如下,&a+1不是首地址+1,系統會認為加了一個整個a數組,偏移了整個數組a的大小也就是5個int的大小)。所以int *ptr=(int *)(&a+1);其實ptr實際是&(a[5]),也就是a+5.

原因為何呢?

&a是數組指針,其類型為int(*)[5];

而指針加1要根據指針類型加上一定的值,不同類型的指針+1之後增加的大小不同,a是長度為5的int數組指針,所以要加5*sizeof(int),所以ptr實際是a[5],但是ptr與&a+1)類型是不一樣的,這點非常重要,所以ptr-1只會減去sizeof(int*),a,&a的地址是一樣的,但意思就不一樣了,a是數組首地址,也就是a[0]的地址,&a是對象數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]。

11、new是在C++中用來分配內存空間的。比如下面的語句:

int *p = new int;
該語句首先定義了一個指向int的指針p,然後在堆(heap)上分配出了一塊存儲區可以保存整數"new int",最後將該存儲區的地址付給指針p。new出來的存儲區是不會自動釋放的,所以你要在合適的地方用delete釋放該存儲區:"delete p;"
new也可以用來為數組類型分配一塊連續的存儲區:
int *p = new int[10];
這個語句就分配了一塊連續的存儲區可以保存10個整數。相應的釋放語句有一點變化:
delete[] p;
如果你熟悉c中的malloc()和free()的話,他們是可以和new與delete類比的,但是new和delete會在處理存儲資源時調用對象或者結構的構造函數與析構函數。這是和malloc與free的最重要區別

12、sizeof,strlen,char *str1

char * str1 = (char *)malloc(100);

str1 = "sfsdfdfdf";


sizeof(str1) == 4 ; 因為str1為指針對象,所占空間為4字節,其他類型指針也如此

sizeof(*str1)== 1; 因為*str1 指‘s’,*(str1 + 1) 為‘f’ 解引用之後

strlen(str1) == 9  ; 得出字符串的字符個數,不包含'\0'


13、 vector  的 reserve  和 resize 的區別

vector 的reserve增加了vector的capacity,但是它的size沒有改變!而resize改變了vector的capacity同時也增加了它的size!
原因如下:
     reserve是容器預留空間,但在空間內不真正創建元素對象,所以在沒有添加新的對象之前,不能引用容器內的元素。加入新的元素時,要調用push_back()/insert()函數。

     resize是改變容器的大小,且在創建對象,因此,調用這個函數之後,就可以引用容器內的對象了,因此當加入新的元素時,用operator[]操作符,或者用迭代器來引用元素對象。此時再調用push_back()函數,是加在這個新的空間後面的。

14、一般放在函數體後,形如:void   fun()   const;  

 如果一個成員函數的不會修改數據成員,那麼最好將其聲明為const,因為const成員函數中不允許對數據成員進行修改,如果修改,編譯器將報錯,這大 大提高了程序的健壯性。  

15、寶典71頁例9

會在s.p[0]=2;出錯.

因為前面有int *p=&s.i;所以後面的s.p=p就將s.p也指向了s.i,又因為結構體S中的兩個成員變量是相鄰保存的,所以在執行了s.p=p之後,s.p[0]就是s.i變量,而s.p[1]就是與s.i相鄰的s.p指針,因此s.p[1]=1;就是在為s.p指針變量賦值,即改變s.p指針的指向,所以,在執行完s.p[1]=1;之後,s.p不再指向成員變量i,而是指向了地址1,這顯然是一個非法地址,不能寫入,而最後的s.p[0]=2(相當於*s.p=2)是在向s.p指針指向的地址賦值,也就是試圖向地址1寫入數值,當然就出錯了.


關鍵點同一個地址內,整形強制轉換成地址型賦給指針

       s.p[1] 為整形,s.p 為指針類型,但是二者的地址相同,在同一個地方。所以在給s.p[1]賦值為1的時候,1強制轉化成了地址型 0x00000001;615

16、單個整形轉字符類型 只需要 +‘0’

17、數組空間在棧裡、malloc在堆裡

本文出自 “燃燒技術的活力” 博客,謝絕轉載!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved