• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            風雨兼程

            ring my bells
            posts - 49, comments - 14, trackbacks - 0, articles - 0

            C/C++面試題2

            Posted on 2008-05-22 21:55 silentneil 閱讀(468) 評論(0)  編輯 收藏 引用

            1.
             關鍵字static的作用是什么?
            在C語言中,關鍵字static有三個明顯的作用:
            1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。
            2) 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
            3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。
             
            2.
            const最經常的用法
             1.為了防止傳遞的函數參數不被修改,在調用函數的形參中用const關鍵字.
            2.const可以用來創建數組常量、指針常量、指向常量的指針等
            const int a;     //前兩個的作用是一樣,a是一個常整型數。
            int const a;
            const int *a;    //第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。
            int * const a;
            int const * a const; //第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。
            //注:const并不會阻止參數的修改

            3.
            下面的代碼輸出是什么,為什么?
            void foo(void)
            {
                unsigned int a = 6;
                int b = -20;
                (a+b > 6) ? puts("> 6") : puts("<= 6");
            }
            //當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。
            因此-20變成了一個非常大的正整數,所以該表達式計算出的結果大于6。
             
            4.
            #define dPS struct s *
            typedef struct s * tPS;
            以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結構s指針。哪種方法更好呢?(如果有的話)為什么?
            這是一個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef更好。思考下面的例子:
            dPS p1,p2;
            tPS p3,p4;
            第一個擴展為
            struct s * p1, p2;
            .上面的代碼定義p1為一個指向結構的指,p2為一個實際的結構,這也許不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。晦澀的語法
             
            5.int a = 5, b = 7, c;
            c = a+++b;//<==>c = a++ + b;
            這段代碼持行后a = 6, b = 7, c = 12。
             

            6.
            寫出判斷ABCD四個表達式的是否正確, 若正確, 寫出經過表達式中 a的值(3分)
            int a = 4;
            (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
            a = ?
            答:C錯誤,左側不是一個有效變量,不能賦值,可改為(++a) += a;
            改后答案依次為9,10,10,11

            7.頭文件中的 ifndef/define/endif 干什么用?預處理
            答:防止頭文件被重復引用

            8. switch()中不允許的數據類型是?
            答:實型

            9.
            編寫strcat函數(6分)
            已知strcat函數的原型是char *strcat (char *strDest, const char *strSrc);
            其中strDest 是目的字符串,strSrc 是源字符串。
            (1)不調用C++/C 的字符串庫函數,請編寫函數 strcat
            答:
            VC源碼:
            char * __cdecl strcat (char * dst, const char * src)
            {
            char * cp = dst;
            while( *cp )
            cp++; /* find end of dst */
            while( *cp++ = *src++ ) ; /* Copy src to end of dst */
            return( dst ); /* return dst */
            }
            (2)strcat能把strSrc 的內容連接到strDest,為什么還要char * 類型的返回值?
            答:方便賦值給其他變量

            10.

            回答下面的問題(6分)
            (1).Void GetMemory(char **p, int num){
            *p = (char *)malloc(num);
            }
            void Test(void){
            char *str = NULL;
            GetMemory(&str, 100);
            strcpy(str, "hello");
            printf(str);
            }
            請問運行Test 函數會有什么樣的結果?
            答:輸出“hello”
            (2). void Test(void){
            char *str = (char *) malloc(100);
            strcpy(str, “hello”);
            free(str);
            if(str != NULL){
            strcpy(str, “world”);
            printf(str);
            }
            }
            請問運行Test 函數會有什么樣的結果?
            答:輸出“world”
            (3). char *GetMemory(void){
            char p[] = "hello world";
            return p;
            }
            void Test(void){
            char *str = NULL;
            str = GetMemory();
            printf(str);
            }
            請問運行Test 函數會有什么樣的結果?
            答:無效的指針,輸出不確定
             
            11.
            程序什么時候應該使用線程,什么時候單線程效率高。
            答:1.耗時的操作使用線程,提高應用程序響應
            2.并行操作時使用線程,如C/S架構的服務器端并發線程響應用戶的請求。
            3.多CPU系統中,使用線程提高CPU利用率
            4.改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨
            立的運行部分,這樣的程序會利于理解和修改。
            其他情況都使用單線程。

            12
            .C++中什么數據分配在?;蚨阎校琋ew分配數據是在近堆還是遠堆中?
            答:棧: 存放局部變量,函數調用參數,函數返回值,函數返回地址。由系統管理
            堆: 程序運行時動態申請,new 和 malloc申請的內存就在堆上
            13.
            int i=10, j=10, k=3;
            k*=i+j; k最后的值是?
            答:60,此題考察優先級,實際寫成: k*=(i+j);,賦值運算符優先級最低

            14.
            ICMP是什么協議,處于哪一層?
            答:Internet控制報文協議,處于網絡層(IP層)
            15.
            全局變量和局部變量在內存中是否有區別?如果有,是什么區別?
                  全局變量儲存在靜態數據庫,局部變量在堆棧。
            17.
            -1,2,7,28,,126請問28和126中間那個數是什么?為什么?
            第一題的答案應該是4^3-1=63
            規律是n^3-1(當n為偶數0,2,4)
                  n^3+1(當n為奇數1,3,5)
             
            18.
            Heap與stack的差別。
            Heap是堆,stack是棧。
            Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。
            Stack空間有限,Heap是很大的自由存儲區
            C中的malloc函數分配的內存空間即在堆上,C++中對應的是new操作符。
            程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上進行

            19.
            用宏定義寫出swap(x,y)     //如果把較長的宏定義分成干行,須在待續的行末尾加上\
            #define swap(x,y) \
            x=x+y;\
            y=x-y;\
            x=x-y
            注意:結尾沒有;
            20
            一個指針為4個字節
             int *p;
             printf("%d",sizeof(p));//輸出: 4

            void Func(char str[100])
            {
            printf("%d\n", sizeof(str));
            }
            答:
            4
            分析:
            指針長度
            一個32位的機器,該機器的指針是多少位
            指針是多少位只要看地址總線的位數就行了。80386以后的機子都是32的數據總線。所以指針的位數就是4個字節了。
            21.
            main()
            {
              int a[5]={1,2,3,4,5};
               int *ptr=(int *)(&a+1);    //ptr實際是&(a[5]),也就是a+5
               printf("%d,%d",*(a+1),*(ptr-1));
            }
            輸出:2,5
            *(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
            &a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大?。ū纠?個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)類型是不一樣的(這點很重要)
            所以prt-1只會減去sizeof(int*)
            a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].

            22.
            1)給定結構struct A
            {
                   char t:4;
                   char k:4;
                   unsigned short i:8;
                   unsigned long m;
            };問sizeof(A) = ?
            給定結構struct A
            {
                   char t:4; 4位
                   char k:4; 4位
                   unsigned short i:8; 8位     
                   unsigned long m; // 偏移2字節保證4字節對齊
            }; // 共8字節

            23.
            //輸出結果: 15
            #include<stdio.h>
            int main(void)
            {
             char aa[10];
                printf("%d",strlen(aa));
             return 0;
            }
             
            24.
            C和C++有什么不同?
            從機制上:c是面向過程的(但c也可以編寫面向對象的程序);c++是面向對象的,提供了類。但是,
            c++編寫面向對象的程序比c容易
            從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c++適合更上層的,復雜的; llinux核心大部分是c寫的,因為它是系統軟件,效率要求極高。
            從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因為c++比
            c來說擴充的東西太多了,所以就在c后面放上兩個+;于是就成了c++
            C語言是結構化編程語言,C++是面向對象編程語言。
            C++側重于對象而不是過程,側重于類的設計而不是邏輯的設計。

            25 &和&&的區別。
            &是位運算符。&&是布爾邏輯運算符。
            26,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
            short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型??尚薷臑閟1 =(short)(s1 + 1) .short s1 = 1; s1 += 1正確。

            27.
            17.在不用第三方參數的情況下,交換兩個參數的值
            #include <stdio.h>
            void main()
            {
                int i=60;
                int j=50;
                i=i+j;
                j=i-j;
                i=i-j;
                printf("i=%d\n",i);
                printf("j=%d\n",j);
            }
            方法二:
            i^=j;
            j^=i;
            i^=j;
            方法三:
            // 用加減實現,而且不會溢出
            a = a+b-(b=a)
            28.
            假設你有8個球,其中一個略微重一些,但是找出這個球的惟一方法是將兩個球放在天平上對比。最少要稱多少次才能找出這個較重的球?

            答:
            2次就可以了,方法:將其分成3堆,分別是3個、3個、2個。
            第一次天平兩邊各放3個,會有兩種情況,一、兩邊持平一樣重,那較重的球則不在里面,那就把剩下的兩個稱一下就能找到較重那個了。第二種情況是有一邊較重,那較重的球就在較重那邊的3個之中,第二次稱就是就在這3個之中拿出兩個來比較,也有兩種情況,持平則較重的是沒放進去稱的那個,有一邊較重則那個就是較重的。

            青青草原精品99久久精品66| 无码伊人66久久大杳蕉网站谷歌 | 国产成人精品久久免费动漫 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国产香蕉97碰碰久久人人| 精品熟女少妇aⅴ免费久久| 久久久久亚洲爆乳少妇无 | 婷婷久久综合九色综合绿巨人 | 99精品国产免费久久久久久下载| 久久久国产视频| 91精品国产综合久久久久久| 精品久久久久久国产牛牛app| 久久99精品久久久大学生| 国产亚洲色婷婷久久99精品91| 欧美精品九九99久久在观看| 亚洲午夜久久久精品影院| 奇米综合四色77777久久| 久久久久久一区国产精品| jizzjizz国产精品久久| 国产aⅴ激情无码久久| 久久综合日本熟妇| 国产一区二区精品久久凹凸 | 热re99久久6国产精品免费| 日日狠狠久久偷偷色综合0| 久久无码av三级| 精品久久久久久亚洲精品| 99久久99久久精品国产片果冻| 久久天天日天天操综合伊人av| 精品国产福利久久久| 久久国产精品99精品国产| 久久精品亚洲AV久久久无码| 亚洲va久久久久| 色综合久久夜色精品国产| 亚洲欧美日韩精品久久亚洲区 | 性做久久久久久久久老女人 | 久久亚洲AV成人出白浆无码国产| 精品水蜜桃久久久久久久| 精品久久久久久无码国产| 久久午夜无码鲁丝片午夜精品| 久久精品国产99久久久香蕉| 狠狠久久综合伊人不卡|