全国计算机二级第二套

12有以下程序

#include <stdio.h>

main()

{  int  k=-17;

   printf("%d,%o,%x\n", k, 1-k, 1-k);

}

程序的运行结果是()。

A) -17,22,12

B) -17,12,22

C) -17,-22,-12

D) 17,22,12

答案:A

【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整常量没有前缀,输出格式控制符为%d;八进制整常量以0作为前缀,输出格式控制符为%o;十六进制整常量以0X或0x作为前缀,输出格式控制符为%x。1-k=18,整型常量18用八进制表示为22,十六进制表示为12,A选项正确。

13以下定义语句中正确的是()。

A) int  a=b=0;

B) char  A=65+1,b='b';

C) float  a=1,*b=&a,*c=&b;

D) double  a=0.0; b=1.1;

答案:B

【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。

14有以下程序:

#include  <stdio.h>

main()

{  int s,t,A=10; double B=6;

  s=sizeof(A); t=sizeof(B);

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

}

在VC6.0平台上编译运行,程序运行后的输出结果是(  )。

A) 10,6

B) 4,4

C) 2,4

D) 4,8

答案:D

【解析】C语言中利用sizeof()函数判断数据类型长度,在VC6.0平台中,整型int占有4个字节,double型数据占有8个字节。

15表达式:(int)((double)9/2)- 9%2 的值是()。

A) 0

B) 3

C) 4

D) 5

答案:B

【解析】先将整型数据9强制转换成double型,然后除以2得到的结果与double型保持一致,即为4.5,然后将4.5强制转换成整型数据4,然后计算9%2的值为1,最后计算4-1的值为3,所以选择B选项。

16设有定义:int x=11,y=12,z=0;,以下表达式值不等于12的是()。

A) (z,x,y)

B) (z=x,y)

C) z=(x,y)

D) z=(x==y)

答案:D

【解析】逗号表达式的计算过程是从左到右逐个求每个表达式的值,取最右边一个表达式的值作为该逗号表达式的值。赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。成功实现赋值后以左值为返回值。逻辑表达式成立则返回1,不成立返回0。A选项逻辑表达式x==y不成立,则z=0,表达式值为0。B选项中逗号表达式x,y取y值为表达式值,然后赋值给z=12,表达式值为12。C选项逗号表达式(x,y)取y值为表达式值,然后赋值给z=12,表达式值为12。D选项逗号表达式(z,x,y)取y值为表达式值12。选择D选项。

17若有定义:int a=0,b=0,c=0,d=0; ,有C语言表达式 (a++ && b++) ? c++ : d++,以下关于其执行顺序的叙述正确是()。

A) 先执行a++,表达式a++的值为0,由此即可确定(a++&&b++)的值为0,因此执行d++

B) 先执行a++,表达式a++的值为0;再执行b++,表达式b++的值为0,由此可确定(a++ && b++)值为0,因此执行d++

C) 先执行a++,表确定(a++ && b++)值为1,因此执行c++达式a++的值为1;再执行b++,表达式b++的值为1,由此可

D) 先执行b++,表达式b++的值为1;再执行a++,表达式a++的值为1,由此可确定(a++ && b++)值为1,因此执行c++

答案:A

【解析】表达式1?表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3。逻辑与运算符遵循"短路求值"策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(a++&&b++)中,左操作数a++的值为0,已经可以确定整个逻辑表达式的结果为0,因此右操作数b++不再求解,直接执行表达式3,即d++,答案为A选项

18)有以下程序:

# include   <stdio.h>

main()

{ unsigned char  a=2, b=4, c=5, d;

  d = a | b;    d &= c;    printf("%d\n", d);     }

程序运行后的输出结果是(  )。

A) 3

B) 4

C) 5

D) 6

答案:B

【解析】& 按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。| 按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4

19)有以下程序

#include <stdio.h>

main( )

{  char c;

   c=getchar();

   do {

      putchar(c++);

   } while((c=getchar()) != '#');

}

程序运行时从第一列开始输入:abcdefg##<回车>,则输出结果是()。

A) bcdefgh$

B) bcdefgh

C) abcdefg#

D) abcdefg

答案:D

【解析】运算符"++"放在变量后面时,先参与其他操作,再对变量+1。putchar(c++)表示先输出当前c值,再对c值+1,当输入abcdef##时,在while语句中,程序输入"#",循环退出。因此输出为abcdefg,答案为D选项。

20)若有定义:char  c; int  d; ,程序运行时输入: 1,2 <回车>,能把值1输入给变量c、值2输入给变量d的输入语句是

A) scanf("%c,%d", &c,&d);

B) scanf("%c%d", &c,&d);

C) scanf("%d,%f", &c,&d);

D) scanf("%d%d", &c,&d);

答案:A

【解析】scanf函数的调用格式为:scanf(格式控制串,地址列表);,格式控制串,由%开头,后跟格式字符,如c对应字符型变量,d对应整型变量。地址表列需要读入的是所有变量的地址或字符串的首地址。如果除了格式说明字符和附加格式字符外,如果还有其他字符,则在输入数据时要求按一一对应的位置原样输入这些字符,比如两个格式说明之间有一个逗号,则从键盘输入时输入量之间也应照原样输入逗号。A选项正确。

21)有以下程序

#include <stdio.h>

main()

{  int a=1,b=2,c=3,d=0;

   if (a==1 && b++==2)

if (b!=2||c--!=3)

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

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

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

}

程序运行后的输出结果是()。

A) 1,3,2

B) 1,3,3

C) 1,2,3

D) 3,2,1

答案:B

【解析】else总是和最近的if配对,所以进入第一个if语句中条件判断时,因为是逻辑与操作需要两边运算对象的值均为非零值,才为真,所以需要逐个执行判断的结果为1,不再执行第二个case语句中的操作。而是进入第二个if语句条件判断,因为b!=2条件成立所以整个条件表达式的值为真,所以不再执行逻辑或的第二个运算对象(c-- !=3)c的值不变,也不再执行第一个else语句。打印a的值1,b的值3,c的值3。

22)有以下程序

    #include <stdio.h>

    main()

    {   int  s;

        scanf("%d", &s);

        while( s>0 )  

        {  switch(s)

           {  case 1: printf("%d", s+5);

             case 2: printf("%d", s+4); break;

             case 3: printf("%d", s+3);

             default: printf("%d", s+1); break;

           }

           scanf("%d", &s);

        }

    }

运行时,若输入1 2 3 4 5 0<回车>,则输出结果是()。

A) 66656

B) 6566456

C) 66666

D) 6666656

答案:B

【解析】switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句。然后退出。所以输入1时打印65,输入2时打印6,输入3时打印64,输入4时打印5,输入5时打印6。

23)设有以下代码

do {

   while (条件表达式1)

        循环体A;

} while (条件表达式2);

while (条件表达式1)

{

   do {

      循环体B;

   } while (条件表达式2);

}

其中,循环体A与循环体B相同,以下叙述正确的是()。

A) 循环体A与循环体B的执行次数相同

B) 循环体A比循环体B的执行次数多一次

C) 循环体A比循环体B的执行次数少一次

D) 循环体A与循环体B的执行次数不确定

答案:A

【解析】while循环语句一般形式为:while(表达式){循环体},执行过程为:首先判断表达式,成立(非0)则执行循环体,不成立(0)则退出循环。do…while循环语句一般形式为:do{循环体}while(表达式),执行过程为:首先执行循环体,之后判断表达式,成立(非0)则再一次执行循环体,不成立(0)则退出循环。假设表达式1与表达式2成立次数为n1与n2。若n1>n2,则循环体A执行次数为n2+1,B执行次数n2+1;若n1<n2,则循环体A执行次数为n1,B执行次数n1,A选项正确。

24)有以下程序

#include <stdio.h>

main( )

{  int a=0, b=0;

   for(; a<5; a++)

   {  if (a%2==0) continue;

      b += a;

      break;

   }

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

}

程序运行后的输出结果是()。

A) 1

B) 4

C) 0

D) 10

答案:A

【解析】for语句中,当a=0时,满足for循环中if语句的条件,执行continue继续下一次循环,a+1后再进入for语句循环,此时a=1不满足if语句,执行b=b+a为1,接着执行break语句,终止循环,最后输出b=1,故答案为A选项。

25)有以下程序

    #include <stdio.h>

    main()

    {  int   i=5;

       do

       {  if (i%3==1)

            if (i%5==2)

            {  printf("*%d", i);  break;  }

          i++;

       }  while(i!=0);

       printf("\n");

    }

 

程序的运行结果是

A) *2*6

B) *3*5

C) *5

D) *7

答案:D

【解析】do...while语句是先执行后判断,所以第一次先执行循环体,判断i%3= =1的条件,由于i为5所以余数为2,条件不成立,执行i++,i的值为6,判断while条件为真,第二次执行循环体,同第一次循环体的执行过程一样,i的值变为7,判断while条件为真,第三次执行循环体,此时i%3= =1条件成立,判断i%5==2也成立,打印*与i的值,即*7,然后执行break语句,跳出循环。所以选择D选项。

26)有以下程序

     #include <stdio.h>

     main()

     {  int  c[6]={10,20,30,40,50,60},  *p,*s;

        p = c;    s = &c[5];

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

     }

程序运行后的输出结果是()。

A) 5

B) 50

C) 6

D) 60

答案:A

【解析】首先初始化一维数组c[6],语句p = c;指将c[0]元素的地址赋给指针变量p;语句s = &c[5];指将c[5] 元素的地址赋给指针变量s。程序最后输出s-p,即结果为5。因此A选项正确。

27)有以下程序

#include  <stdio.h>

void  fun( int  a[ ], int  n, int  flag )

{  int  i=0,j, t;

   for ( i=0; i<n-1; i++ )

      for ( j=i+1; j<n; j++ )

        if ( flag )

 

        {   if ( a[i] < a[j] )

            {  t = a[i];  a[i] = a[j];  a[j] = t;  }

        }

       else

       {   if ( a[i] > a[j] )

           {  t = a[i];  a[i] = a[j];  a[j] = t;  }

       }

}

main( )

{  int  c[10]={ 7,9,10,8,3,5,1,6,2,4 },i;

   fun( c, 4, 1 );

   fun( c+4, 6, 0 );

   for ( i=0;i<10; i++ )    printf( "%d,", c[i] );

   printf("\n");

}

程序运行后的输出结果是()。

A) 7,8,9,10,6,5,4,3,2,1

B) 10,9,8,7,6,5,4,3,2,1

C) 10,9,8,7,1,2,3,4,5,6,

D) 1,2,3,4,5,6,7,8,9,10,

答案:C

【解析】fun()函数作用冒泡法排序,flag控制升序(0)或者降序(1)。n为参与排序的个数。a为数组的起始地址。因此,fun(a,4,1),数组的前四个降序排序,fun(a+4,6,0)从数组的第四项,后六个升序排序。故结果为10,9,8,7,1,2,3,4,5,6。答案为C选项

28)下列选项中,能正确定义数组的语句是()。

A) int num[0...2008];

B) int num[];

C) int N=2008;

int num[N];

D) #define N 2008

int num[N];

答案:D

【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。A选项错误,C语言中数组没有此类型的定义方法;B选项错误,定义数组应指明数组大小,如果不指明数组大小,需要给定初值的个数;C选项错误,N为变量,不能用来定义数组大小。因此D选项正确。

29)有以下程序

    #include <stdio.h>

    main()

    {

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

                      {8,6,5,7},

                      {3,7,2,5},

                      {4,8,6,1}};

        int i, j, k, t;

        for (i=0; i<4; i++)

            for (j=0; j<3; j++)

                for (k=j+1; k<4; k++)

                    if (a[j][i] > a[k][i])

                       {

                           t=a[j][i];

                           a[j][i] = a[k][i];

                           a[k][i] = t;

                       } /* 按列排序 */

        for (i=0; i<4; i++)

            printf("%d, ",a[i][i]);

    }

程序运行后的输出结果是()。

A) 1, 6, 2, 1,

B) 8, 7, 3, 1,

C) 4, 7, 5, 2,

D) 1, 6, 5, 7,

答案:D

【解析】首先对二维数组进行赋值操作,a[0][0]、a[0][1]…、a[3][2]、a[3][3]的值为1、4…、6、1。通过for语句和if语句,对二维数组各列元素进行由小到大的排序操作,程序最后通过for语句输出二维数组对角线上的元素。因此D选项正确。

30有以下程序

#include <stdio.h>

main( )

{  char w[20], a[5][10] = {"abcdef", "ghijkl", "mnopq", "rstuv", "wxyz"};

   int i,j;

   for (i=0; i<5; i++)

   {   j=0;

       while (a[i][j]!='\0')  j++;

       w[i] = a[i][j/2+1];

   }

   w[5]= '\0';

   puts(w);

}

程序运行后的输出结果是()。

A) ekpuz

B) agmrw

C) flqvz

D) djoty

答案:A

【解析】在for循环中,执行完while语句,j值为字符串数组a的每行字符串的长度,因此w[i] = a[i][j/2+1],数组a的元素a[i][j/2+1]的值赋给一维数组w[i]。比如i=0;j=6;a[i][j/2+1]=a[0][4]='e',将此值赋给w[0]。循环依次给数组W赋值最后输出w,答案为A选项。

31有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数)

     #include <stdio.h>

     #include <string.h>

     main()

     { char  a[10] = "abc", b[10] = "012", c[10] = "xyz";

       strcpy( a+1, b+2 );

       puts( strcat( a, c+1 ) );

     }

程序运行后的输出结果是()。

A) a12xyz

B) bc2yz

C) a2yz

D) 12yz

答案:C

【解析】本题考查字符串处理函数strcpy和strcat,执行完strcpy( a+1, b+2 );后,a变为a2,执行完strcat( a, c+1 )后,a变为a2yz,所以答案为C选项。

32有以下程序

     #include <stdio.h>

     int f(int  n)

     { int  t = 0,   a=5;

       if (n/2) {int  a=6;    t += a++;  }

       else    {int  a=7;     t += a++;  }

       return  t + a++;

     }

     main()

     { int  s=0, i=0;     

       for (; i<2;i++)  s += f(i);

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

     }

程序运行后的输出结果是

A) 28

B) 24

C) 32

D) 36

答案:B

【解析】在主函数main()中定义了两个变量s和i,同时给s和i赋初值0。当i=0时。执行"s+=f(i);"语句,调用f()并将i的初值 0传递给形参n。首先执行if语句中内条件:n/2,条件为假。则执行else下的语句,a=7,t=7+0=7,使用return返回t,t=7+(a++)=7+5=12,此时a运算完后自增1,变为6;返回主函数中,s=0+12=12。当i=1时,执行"s+=f(i);"语句,调用f()并将i的初值1传递给形参n。首先执行if语句中的条件:n/2,条件为真,执行if下面的语句,t=0,a=6 t=0+6=6,使用return返回t,t=6+6=12,返回主函数中,s=12+12=24。最后输出的结果为24。因此B选项正确。

33有以下程序

     #include <stdio.h>

     void fun( int *a,int *b)

     { int *c;

       c=a;a=b;b=c;

     }

     main()

     { int  x=3, y=5, *p=&x, *q=&y ;

       fun(p,q);  printf("%d,%d,",*p,*q);

       fun(&x,&y); printf("%d,%d\n",*p,*q);

     }

程序运行后的输出结果是()。

A) 3,5,3,5

B) 3,5,5,3

C) 5,3,3,5

D) 5,3,5,3

答案:A

【解析】fun函数的功能是交换形式参数的值,即交换指针变量a和b的值,但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并不能影响p和q指针指向的数据,因此第二个printf语句的输出也是3,5。因此A选项正确。

34有以下程序:

#include  <stdio.h>

int f(int x);

main()

{ int n=1,m;

 m=f(f(f(n))); printf("%d\n",m);

}

int f(int x)

{ return x*2; }

程序运行后的输出结果是(  )。

A) 8

B) 2

C) 4

D) 1

答案:A

【解析】第一次调用m=f(f(f(1))),第二次为m=f(f(2)),第三次为m=f(4),即返回值为8。

35设有如下函数定义:

#include  <stdio.h>

int  fun( int  k )

{  if (k<1)  return  0;

  else  if (k==1)  return  1;

  else  return  fun(k-1)+1;

}

若执行调用语句:n=fun(3);,则函数fun总共被调用的次数是(  )。

A) 2

B) 3

C) 4

D) 5

答案:B

【解析】首先 n=fun(3),3被当作参数传递进去,这就进行了一次调用,3被当做参数传进去后,程序会执行这句 else return fun(k-1)+1; 这就调用了第二次,而参数是3-1也就是2。2被当做参数传进去后,程序会执行这句 else return fun(k-1)+1; 这就调用了第三次,而参数是2-1也就是1。1被当做参数传进去后,程序会执行这句 else if(k==1) return 1; 不再递归调用,所以最终结果为3次。

36以下与存储类别有关的四组说明符中,全部属于静态类的一组是()。

A) extern和static

B) auto和static

C) register和static

D) register和extern

答案:A

【解析】auto用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字通常会被省略,因为所有的变量默认就是auto的。

register定义的变量告诉编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

static变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。当static用来修饰全局变量时,它就改变了全局变量的作用域。

extern限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。extern 外部声明, 该变量在其他地方有被定义过。因此,答案为A选项

37以下选项中的编译预处理命令行,正确的是()。

A)  #define    E      2.38

B)  ##define   PI_2   1.56

C)  #define    int    INT

D)  #DEFINE    TRUE

答案:A

【解析】无参宏定义格式:#define 标识符 字符串,标识符与C语言规定相同,因此,可知选项B,多了#,选项C使用c语言的关键字,选项D 格式不对。因此答案为A选项。

38有以下程序

#include <stdio.h>

#define  S(x)  x/x*x

main( )

{  int  k=6, j=3;

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

}

程序运行后的输出结果是()。

A) 27,27

B) 9,9

C) 27,29

D) 29,29

答案:C

【解析】定义一个带参数的宏时,字符串内的形参通常要用圆括号括起来,以避免出错,本题中,S(k+j)相当于执行运算k+j/k+j*k+j,将k,j值代入运算后取整为27,S(j+k)同理,因此答案为C选项。

39若有以下程序段

    struct  st{ int n; struct st *next; };

    struct st a[3]={ 5,&a[1],7,&a[2],9,'\0' },  *p;

    p=&a[0];

则以下选项中值为6的表达式是()。

A) p->n

B)  (*p).n

C)  p->n++

D) ++(p->n)

答案:D

【解析】本题考查结构体变量的引用,其中a为定义的结构体数组,D选项中p->n为5,++(p->n)为6,所以D选项正确。

40有以下程序

    #include <stdio.h>

    main()

    {  FILE  *fp;

       int   a[10]={1,2,3,0,0}, i;

       fp = fopen("d2.dat", "wb");

       fwrite(a, sizeof(int), 5, fp);

       fwrite(a, sizeof(int), 5, fp);

       fclose(fp);

       fp = fopen("d2.dat", "rb");

       fread(a, sizeof(int), 10, fp);

       fclose(fp);

       for (i=0; i<10; i++)

            printf("%d,", a[i]);

    }

程序的运行结果是

A) 1,2,3,0,0,0,0,0,0,0,

B) 1,2,3,1,2,3,0,0,0,0,

C) 123,0,0,0,0,123,0,0,0,0,

D) 1,2,3,0,0,1,2,3,0,0,

答案:D

【解析】本题考查文件操作函数,两次fwrite后,fp文件中已经写入1,2,3,0,0,1,2,3,0,0然后将文件fp中的内容重新写入数组a中,最后输出a为1,2,3,0,0,1,2,3,0,0,所以选项D正确。

 

转载于:https://www.cnblogs.com/chengtou/p/8615784.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值