2.8 数据类型与作用域练习

1、选择题

1.1以下选项中,不能作为合法常量的是 ___B___ 

A)1.234e04    B)1.234e0.4

C)1.234e+4    D)1.234e0

解析:在C语言中,合法的浮点常量形式通常遵循以下规则:1.可以有整数部分、小数部分和指数部分。2.指数部分以字母 'e' 或 'E' 开头,后面跟着一个整数。1.234e0.4:这不是一个合法的浮点常量,因为指数部分(0.4)不是一个整数。

1.2、以下定义变量并初始化错误的是____D____

     A)     char   c1 =  ‘H’ ;

     B)     char   c1 =  99 ;   

     C)     char   c1 = 2’;

     D)     char   c1 =  09 

解析:以0开头的数字在C语言中通常被解释为八进制数。然而,八进制数中不应该包含数字8或9。因此,09不是一个有效的八进制数,这将导致编译错误

1.3、以下定义变量及初始化错误的是_____C_____

A)     int   a=3b

     B)     int   a b=3

     C)     int   a b, c=d=3

     D)     int   a=3 b=3

解析:int a, b, c=d=3;:这是错误的。这里试图将 d 初始化为3,并用这个值来初始化 c,但是 d 并没有在之前声明或定义,因此这是一个编译错误

1.4、设有如下程序:( D )

        #include "stdio.h"

int  main()

        {

int  a, b;

          a = 077;

          b= a/5;

          printf( "%d %d \n" ,  a , b);

        }

A)     77 15.2

     B)     77, 15

     C)     63 12.2    

     D)     63 12

解析:在C语言中,以0开头的数字被视为八进制数。所以,077实际上是一个八进制数,我们需要将其转换为十进制数来理解它的真实值。八进制的077转换为十进制是:7*8^1+7*8^0=56+7=63。因此,a的值为63。b为int整型,所以是b=a/5=63/5=12

1.5有以下程序

main()

{   int  m,n,p;

   scanf("m=%dn=%dp=%d",&m,&n,&p);

   printf("%d%d%d\n",m,n,p);

}

若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,则正确的输入是 ___B___

A)m=123n=456p=789

B)m=123  n=456  p=789

C)m=123,n=456,p=789

D)123   456   789

解析:scanf的格式字符串指定了如何读取输入数据。在这个程序中,scanf的格式字符串是"m=%dn=%dp=%d",这意味着scanf期望输入数据的格式是类似于m=值n=值p=值的,其中是要读取的整数。因此,为了将值123赋给m456赋给n,和789赋给p,正确的输入应该是:m=123 n=456 p=789

   1.6、以下程序的正确结果是___C____

#include<stdio.h>

void  num()

{

         extern int x,y; int a=15,b=10;

 x=a-b;

y=a+b;

}

int  x, y;

int  main()

{

    int a=7,b=5;

x=a+b;

y=a-b;

num();

printf("%d,%d\n",x,y);

}

A)  12,2    B)  不确定   C)  5,25  D)  1,12

解析:main函数中,x被赋值为a+b(即7+5),所以x变为12。同样,y被赋值为a-b(即7-5),所以y变为2。接下来,调用num函数。在这个函数中,xy是外部变量,可以通过extern关键字在函数内部访问。同时,函数内部还定义了两个局部变量ab,它们与main函数中的ab是不同的变量。在num函数中,x被赋值为a-b(即15-10),所以x变为5。同样,y被赋值为a+b(即15+10),所以y变为25。所以输出的结果是5,25

1.7  有以下程序   

#includ <stdio.h>

int fun( )

{

static int x=1

x*=2;

return x;

}

int  main( )

{

int i, s=1;

s*= fun()

s*=fun()

s*=fun()

printf("%d\n",s);

}

程序运行后的输出结果是    D   

A)8 B)16 C)32 D)64

解析:在main函数中,变量s被初始化为1,然后连续三次调用fun函数,并将返回的结果与s相乘。

下面是程序的执行流程:1.s初始化为1。2.第一次调用fun()x为1,x乘以2后变为2,返回2。因此,s变为1 * 2 = 2。3.第二次调用fun()x为2,x乘以2后变为4,返回4。因此,s变为2 * 4 = 8。4.第三次调用fun()x为4,x乘以2后变为8,返回8。因此,s变为8 * 8 = 64。最终,printf函数打印出s的值,即64。

2、填空题

2.1以下程序运行时若从键盘输入:10  20  30<回车>。输出结果是   10030   

#include  <stdio.h>

main()

{     int  i=0,j=0,k=0;

      scanf("%d%*d%d",&i,&j,&k);   // %*d 表示跳过某个输入的内容,使下一个输入的内容复制给紧接着的变量,表示此数据不读入

      printf("%d%d%d\n",i,j,k);

}

解析:第一个整数10被读取并存储在变量i中,所以i为10。第二个整数20被读取但由于%*d的存在,它不会被存储在任何变量中,而是被跳过。由于j变量在scanf中没有对应的格式说明符,因此j的值不会被改变,它将保持其初始值0,所以j=0。第三个整数30被读取并存储在变量k中,所以k=30。所以输出结果为:10030

2.2、以下程序运行的结果是___________

      main( )

      {

        int a=1, b=2, c=3;

        ++a; //a=a+1

        c+=++b;

           {

             int  b=4,  c;

              c=b*3;

              a+=c;    

              printf(“first: %d,%d,%d\n”, a,b,c);

              a+=c;

              printf(“second: %d,%d,%d\n”, a,b,c);

}

printf(“third: %d,%d,%d\n”, a,b,c);

}

解析:外层:++a:a=1+1=2,b=2,c+=++b:c=c+b+1=6,b=2+1=3

里层:b=4,c=b*3=4*3=12,a+=c:a=a+c=2+12=14,所以first:14,4,12。a=a+c=14+12=26,所以second:26,4,12。

外层:third:26,3,6

3、编程题

3.1 编写程序,用getchar函数读入两个字符给变量c1c2,然后分别用putchar函数和printf函数输出这两个字符,并思考一下以下问题

1)变量c1c2应定义为字符型或整型?还是二者皆可

答:getchar函数返回的是一个int类型的值,这是为了可以容纳EOF(文件结束标志,通常是-1)以及所有可能的字符值。因此,虽然字符型(char)变量在大多数情况下可以存储从getchar返回的值,但定义为整型(int)更为安全,因为它可以处理所有情况,包括EOF

2)要求输出c1c2值的ASCII码,应如何处理?用putchar函数还是printf函数?

答:putchar函数只能输出字符,不能输出ASCII码。要输出ASCII码,应该使用printf函数。

3)整型变量与字符型变量是否在任何情况下都可以互相替换?

答:不是。虽然char类型在C语言中实际上是一个小整数类型,并且在许多情况下可以存储和整型变量相同的信息,但它们的范围和用途是不同的。char类型通常用于存储字符数据,其范围取决于编译器实现(可以是signedunsigned),但通常足以存储ASCII字符集。整型变量(如int)用于存储更大范围的整数值。

#include <stdio.h>
int main()
{
    int c1, c2; //定义为整型,因为getchar返回的是int类型
    printf("Please enter first character: ");
    c1=getchar();//读取第一个字符
    getchar();//读取中间的换行符
    printf("Please enter second character: ");
    c2=getchar();//读取第二个字符
    //使用putchar输出字符
    printf("The first character is: ");
    putchar(c1);
    printf("\n");
    printf("The second character is: ");
    putchar(c2);
    printf("\n");
    //使用printf输出字符的ASCII码
    printf("ASCII of c1: %d\n", c1);
    printf("ASCII of c2: %d\n", c2);
    return 0;
}

结果:

4、分析题

4.1、使列举static关键字的几个作用

  1. 局部变量:
    在函数内部,当你声明一个局部变量为static时,这个变量的生命周期会被延长,从原来的只在函数执行期间存在变为在整个程序执行期间都存在。这意味着,每次函数调用结束后,这个变量的值不会被销毁,而是会保留下来,供下次函数调用时使用。
  2. 全局变量和函数:
    在文件作用域(即,不在任何函数内部)中,static关键字可以用来声明全局变量或函数的作用范围限制在定义它的文件内。这样,其他文件就不能访问到这个变量或函数了,这有助于实现封装和模块化。
  3. 类的成员变量和成员函数:
    在C++的类定义中,static关键字也可以用于成员变量和成员函数。静态成员变量和静态成员函数都是类的所有对象共享的。静态成员变量在所有对象中只有一个实例,而静态成员函数则可以在没有创建类的对象的情况下被调用。
  4. 静态类:
    在C++中,你还可以创建静态类。静态类只能包含静态成员,不能包含非静态成员。静态类不能被实例化,只能被继承。

一、隐藏

在我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,也就是说其他文件可以看到写同名的函数,如果加了static,那么其他文件就不能同名函数或者变量;(对于函数来讲,static的作用仅限隐藏)

二、保持变量内容的长久

Static修饰的变量会存储到静态数据区,静态块会在程序刚开始是完成初始化,也是唯一的一次初始化;

静态存储区,共有两种变量,全局变量和static变量

三、默认初始化为0

全局变量也具有这个属性,因为静态数据区中所有的字节默认值都是0x00

#include <stdio.h>

Int main()

{

char c1,c2;

int x, y;

scanf(“%d”, &x);

getchar();

c1=getchar();

scanf(“%d”,& y);

getchar();

c2=getchar();

if( c1 == ‘+’ )

c1 = ‘-’

else

c1 = ‘+’ ;

printf(“%d% c%d% c\n”, x,c1,y,c2);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值