C&C++經典基礎題(常年更新)

1、有以下程序
        main(){
            int a=1,b=2,m=0,n=0,k;
            k=(n=b>a)||(m=a<b);
            printf("%d,%d\n",k,m);
        }
        程序運行後的輸出結果是______。

        A:0,0
        B:0,1
        C:1,0
        D:1,1

        答案:C
        評析:
        本題的考查點是邏輯或運算。
        a||b若a,b之一爲真,則a||b爲真,但如果a爲真,則b不用考慮,也就是無需計算,仍爲原值。
        結合本題,因爲b>a爲真,即n=1,所以m不用計算仍爲原值,且k值爲1。
        故本題答案爲C。

2、有以下程序
            main(){
            int a;
            char c=10;
            float f=100.0;
            double x;
            a=f/=c*=(x=6.5);
            printf("%d %d %3.1f %3.1f\n",a,c,f,x);
        }
        程序運行後的輸出結果是______。

        A:1 65 1 6.5
        B:1 65 1.5 6.5
        C:1 65 1.0 6.5 
        D:2 65 1.5 6.5

        答案:B
        評析:
        本題的考查點是複合的賦值運算符。
        在賦值符"="之前加上其它運算符,可以構成複合的運算符。運算方向爲自右至左。
        本題中先計算c的值,c=c*(x=6.5)=10*6.5=65;
        接下來計算f的值,f=f/c=100.0/65=1.5;
        最後計算a的值,a=f,因爲a爲整數,取f的整數部分即爲1。故本題答案爲B。


        

3、有以下程序
        main()
        {int x, y, z;
            x=y=1;
            z=x++,y++,++y;
            printf("%d,%d,%d\n",x, y, z);
        }
        程序運行後的輸出結果是______。

        A:2,3,3
        B:2,3,2
        C:2,3,1
        D:2,2,1

        答案:C
        評析:
        本題考查的是C語言的運算規則。
        x++:表示在使用x之後,使x的值加1;y++:表示在使用y之後,使y的值加1;++y:表示在使用y之前,使y的值加1。此題中執行z=x++,是將x的值先賦給z,所以z=1,接下來x自行加1,其結果爲2;執行y++後,y=2,執行++y後,y=3。 故本題答案爲C。

4、設a=5,b=6,c=7,d=8,m=2,n=2,執行

        (m=a>b)&&(n=c>d)
        後n的值爲______。

        A:1 
        B:2 
        C:3 
        D:4 


        答案:B
        評析:
        本題的考查點是邏輯與運算。
        在邏輯表達式的求解中,並不是所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出表達式的解時,才執行該運算符。
        本題中,(m=a>b)的值爲0,求出整個表達式的值爲0,不需執行(n=c>d),所以n仍爲2。故本題答案爲B。

5、設int a=12,則執行完語句a+=a-=a*a後,a的值是______。

        A:552
        B:264
        C:144
        D:-264

        答案:D
        評析:
        本題的考查點是賦值表達式的求解。
        第一步:a*a=144 ;(此時a=12)
        第二步:a-=144相當於a=a-144,a=a-144=-132; (此時a=-132)
        第三步:a+=a相當於a=a+a,a=a+a=-264;
        所以該表達式最後的值應當爲-264。故本題答案爲D。

6、若有以下程序段

        int c1=1 ,c2=2,c3;
        c3=1.0/c2*c1;
        則執行後,c3中的值是______。

        A:0
        B:0.5
        C:1
        D:2

        答案:A
        評析:
        1.0/c2*c1即1.0/2*1的值爲0.5,由於c3的類型爲整型,所以在表達式賦值時,進行類型的自動轉換,將0.5轉換爲整型0。本題答案爲A。

7、已有定義:int x=3,y=4,z=5;,則表達式!(x+y)+z-1&&y+z/2的值是______。

        A:6
        B:0
        C:2
        D:1

        答案:D
        評析:
        本題的考查點是運算符的優先級。
        在本題中,運算符的優先級分別爲:!大於/大於+,-大於&&,即:!(3+4)+5-1&&4+5/2=0+5-1&&4+2=4&&6=1。故本題答案爲D。

8、以下正確的字符串常量是______。

        // A:"\\\"
        // B:'abc'
        // C:Olympic Games
        // D:" "

        // 答案:D
        // 評析:
        // 本題的考查點是字符串常量。
        // 字符串常量是由一對雙引號括起的字符序列。例如:"CHINA","C program","$12.5" 等都是合法的字符串常量。
        // 選項A中雙引號內使用了兩個轉義符,即後一個雙引號也作爲字符串的內容了,故此字符串中還缺少用於表示字符串結束的引號,所以選項A的表示法錯誤;
        // 選項B,C均沒有用雙引號括起來,所以並不是字符串;選項D表示空字符串,是正確的表示法。故本題答案爲D。

9、若有下面的說明和定義,則sizeof(struct aa)的值是______。
struct aa
{int r1;double r2;float r3;
    union uu{
        char u1[5];
        long u2[2];
    }ua;
}maya;

A:30
B:29
C:24
D:22

答案:D
評析:

本題的考查點是結構體的長度。
sizeof(x)爲運算符,它運算的結果是x型的數據結構佔用的內存字節數,題目中定義了一個結構體aa,它的長度爲其中數據成員所佔內存的總和。
int型的變量需要2個字節;double型的變量需要8個字節;float型的變量需要4個字節;題目中結構體aa包含了一個共用體uu,而共用體變量在內存中所佔的長度等於最長的成員的長度,而char型的變量需要1個字節,char u1[5]即需要5個字節,long型的變量需要4個字節,long u2[2]即需要8個字節,所以共用體uu需要8個字節的存儲空間;因此,sizeof(struct aa)的值應爲2+8+4+8=22個字節。
故本題答案爲D。

 

10、若有以下說明和定義

    union dt {
        int a;char b;double c;
    } data;
    以下敘述中錯誤的是______。

    A:data的每個成員起始地址都相同
    B:變量data所佔的內存字節數與成員c所佔字節數相等
    C:程序段:data.a=5;printf("%f\n",data.c);輸出結果爲5.000000
    D:data可以作爲函數的實參

    答案:C
    評析:

    本題考查的是共用體。
    union是表示共用體的關鍵字,說明其內的成員a,b,c共佔用同一個內存空間,所以data的每個成員起始地址都相同;共用體變量所佔的內存長度等於最長的成員的長度,故變量data所佔的內存字節數與成員c所佔字節數相等;但由於各成員變量的類型不一致,所以它們的存儲方式也不相同,整型佔用2個字節的存儲空間,double型佔用8個字節的存儲空間;
    另外data可以作爲函數的實參,此時data作爲一個地址進行地址傳送;
    執行"data.a=5;printf("%f\n",data.c);"系統不能自動將整型變量轉換爲浮點型值,printf函數只是將內存中的數據以不同的類型輸出,而不能將內存中的整型數據自動轉換爲等值的浮點數,故C是錯誤的。
    故本題答案爲C。

 

11、設有以下定義
union data{ 
    int d1; float d2; 
} demo;
則下面敘述中錯誤的是______。

A:變量demo與成員d2所佔的內存字節數相同
B:變量demo中各成員的地址相同
C:變量demo和各成員的地址相同
D:若給demo.d1賦99後,demo.d2中的值是99.0

答案:D
評析:

本題的考查點是共用體的存儲特點。
共用體的存儲特點:
(1)同一塊內存可以存放不同類型的數據,但在某一時刻只能存放其中的一種;
(2)共用體變量中起作用的成員是最後一次存放的成員,即在存入一個新的成員後原有的成員失去作用,所以選項D的說法是錯誤的;
(3)共用體變量的地址和它的成員的地址是同一個地址,且各成員的地址也相同,因爲共用體成員是共同佔用同一段存儲空間的,所以選項B,C的說法都正確;
(4)共用體變量不能整體被賦值,也不能給共用體變量賦初值;
(5)共用體所佔的內存長度等於最長的成員的長度,所以選項A的說法正確。
故本題答案爲D。

12、有以下程序,用於進行編譯器大小端模式判斷
        main(){
            union{
                char ch[2];
                int d;
            }s;
            s.d=0x4321;
            printf("%x,%x\n",s.ch[0],s.ch[1]);
        }
        在16位編譯系統上,程序執行後的輸出結果是______。

        答案:21,43

        評析:

        本題考查的是共用體。
        int類型變量和字符數組ch共用兩個字節的相同的存儲單元,通常ch[0]位於低字節,ch[1]位於高字節,所以s.ch[0]=21,s.ch[1]=43。
        故本題答案爲21,43。

13、設有如下枚舉類型定義

        enum language {
            Basic=3,Assembly=6,Ada=100,COBOL,Fortran
        };
        枚舉量Fortran的值爲______。

        答案:102

        評析:

        本題考查的是枚舉類型。
        這個枚舉中共有5個元素,前三個已有明確的賦值,而COBOL和Fortran沒有明確的賦值,枚舉的語法規定當枚舉元素沒有賦值時,其值爲其前一個元素的值加一,所以COBOL的值爲101,故Fortran的值應爲102。
        故答案爲102。

14、下列選項中正確的語句組是______。

        // A:char s[8]; s={"Beijing"}

        // B:char *s; s={"Beijing"}

        // C:char s[8]; s="Beijing"

        // D:char *s; s="Beijing"

        // 答案:D
        // 評析:

        // 本題的考查點是字符串的定義和賦初值。
        // 選項A.C是對字符數組初始化,可以是逐個字符賦給數組中各元素,也可以對整個字符串賦初值,但必須是字符型(s型),並且C語言規定,只有靜態存儲(static)數組和外部存儲(extern)數組才能初始化。所以選項A.C都不對。應該這樣來實現:static char s[ ]="Beijing";選項B.D是想通過字符指針來實現,正確的格式是char *s; s="Beijing"。
        // 故本題答案爲D。

        // 知識點:知識點/知識點/數組的定義和引用/字符串與字符數組

15、在C語言中,函數中變量的隱含存儲類別是______。

    A:auto
    B:static
    C:extern
    D:無存儲類別

    答案:A
    評析:

    本題考查的是函數中變量的存儲類別。
    函數中變量的存儲類別包括auto,static,extern,其中auto爲隱含存儲類別,static爲靜態存儲類別,register是寄存器存儲類別。
    故本題答案爲A。

16、若程序中定義了以下函數,

        double myadd(double a,double b){
            return(a+b);
        }
        並將其放在調用語句之後,則在調用之前應該對函數進行說明,以下選項中錯誤的說明是______。

        A:double myadd(double a, b);
        B:double myadd(double,double);
        C:double myadd(double b, double a);
        D:double myadd(double x, double y);

        答案:A
        評析:

        對函數的"定義"和"說明"不是一回事。"定義"是指對函數功能的確立,包括指定函數名,函數值類型、形參及其類型、函數體等,它是一個完整的、獨立的函數單位。
        而"說明"則是對已定義的函數的返回值進行類型說明(或稱"申明"),它只包括函數名、函數類型、以及一個空的括弧,不包括形參和函數體。
        對被調函數進行說明的作用是告訴系統:在本函數中將要用到的某函數是XX類型。也就是說明該函數的返回值的類型,以便在主調函數中按此類型對函數值作相應的處理。
        本題選項A中,函數參數列表中,不可以用一類型聲明多個變量,即變量b沒有被聲明,所以出錯。
        故本題答案爲A。

17、有以下程序
        int a=1;
        int f(int c){
            static int a=2;
            c=c+1;
            return (a++)+c;
        }
        main(){
            int i,k=0;
            for(i=0;i<2;i++){
                int a=3; k+=f(a); 
            }
                k+=a;
            printf("%d\n",k);
        }
        程序的運行結果是______。

        A:14
        B:15
        C:16
        D:17

        答案:A
        評析:

        本題的考查點是變量的作用域和生存期。
        本題定義的"int a=1;"中的全局變量a,其作用範圍是從定義此變量的位置開始到本源文件結束;
        "static int a=2;"中的靜態局部變量a的作用範圍是其所在的函數f,並對其只賦一次初值,以後每次調用函數時不再重新賦初值,而只是保留上次函數調用結束時的值。
        在主函數中,執行第一次for循環,i=1:k=k+f(3),其中f(3)的值爲調用函數f後返回的值,即"(a++)+c"的值,由於此時的值爲2+4=6,所以第一次for循環結束後,k=6,a=3;i=2:k=6+f(3),f(3)的值同樣爲"(a++)+c"的值
        由於在f函數中a是靜態變量,所以第二次調用f函數時a的值爲第一次調用f函數結束時的值3,故(a++)+c=3+4,所以第二次for循環結束後,k=6+7,即k的值爲13;
        for循環執行兩次結束後,執行k+=a,由於此時的a的值是全局變量的值,所以k=k+a=13+1=14。故程序運行後的結果爲14。
        故本題答案爲A。

18、在一個C源程序文件中所定義的全局變量,其作用域爲______。

        A:所在文件的全部範圍

        B:所在程序的全部範圍

        C:所在函數的全部範圍

        D:由具體定義位置和extern說明來決定範圍

        答案:D
        評析:

        本題的考查點是全局變量的作用域。
        全局變量也稱爲外部變量,它是在函數外部定義的變量。它不屬於哪一個函數,它屬於一個源程序文件。其有效範圍是從定義變量的位置開始到本源文件結束。
        在函數中使用全局變量,一般應作全局變量說明。只有在函數內經過說明的全局變量才能使用。全局變量的說明符爲extern。但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。
        故本題答案爲D。

    

        

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章