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。

    

        

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值