c语言练习题库

一、C语言概述练习题
(一)选择题
1. 一个C程序的执行是从    A        。
A) 本程序的main函数开始,到main函数结束
B) 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束
C) 本程序文件的第一个函数开始,到本程序main函数结束
D) 本程序的main函数开始,到本程序文件的最后一个函数结束
2. 以下叙述不正确的是     AD       。
A) 一个C源程序必须包含一个main函数
B) 一个C源程序可由一个或多个函数组成
C) C程序的基本组成单位是函数
D) 在C程序中,注释说明只能位于一条语句的后面
3. 以下叙述正确的是     C       。
A) 在对一个C程序进行编译的过程中,可发现注释中的拼写错误
B) 在C程序中,main函数必须位于程序的最前面
C) C语言本身没有输入输出语句
D) C程序的每行中只能写一条语句
4. 一个C语言程序是由    B       。
A)一个主程序和若干个子程序组成
B) 函数组成
C) 若干过程组成
D) 若干子程序组成
二、数据类型、运算符与表达式
(一)选择题
1. 若x、i、j、k都是int型变量,则计算下面表达式后,x的值为    C       。
    x=(i=4,j=16,k=32)
A) 4    B) 16                C) 32            D) 52
2. 下列四组选项中,均不是C语言关键字的选项是   A     。
A) define         IF         type
B) getc          char       printf
C) include    case        scanf
D) while    go            pow
3. 下列四组选项中,均是不合法的用户标识符的选项是  B          。
A) W         P_0         do
B) b-a          goto          int
C) float    la0            _A
D) -123    abc            TEMP
4. 下列四组选项中,均是合法转义字符的选项是    A       。
A) ‘\”’    ‘\\’        ‘\n’
B) ‘\’    ‘\017’    ‘\”’
C) ‘\018’    ‘\f’        ‘xab’
D) ‘\\0’    ‘\101’    ‘xlf’
5. 下面正确的字符常量是      D      。
A) “c”    B) ‘\\’’        C) ‘’        D) ‘K’
6. 以下叙述不正确的是     D      。
A) 在C程序中,逗号运算符的优先级最低    
B) 在C程序中,MAX和max是两个不同的变量
C) 若a和b类型相同,在计算了赋值表达式a=b后,b中的值将放入a中,二b中的值不变
D) 当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值
7. 以下叙述正确的是     C       。
A) 在C程序中,每行只能写一条语句    
B) 若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数
C) 在C程序中,%是只能用于整数运算的运算符
D) 在C程序中,无论是整数还是实数,都能被准确无误地表示
8. 已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句c2=‘A’+‘6’-‘3’后,c2中的值为     B       。
A) D    B) 68            C) 不确定的值          D) C
9. sizeof(float)是    B    。
A) 一个双精度型表达式           B) 一个整型表达式
C) 一种函数表达式               D) 一个不合法的表达式
10.设C语言中,一个int型数据在内存中占2个字节,则unsigned int 型数据的取值范围为    C     。
A) 0~255        B) 0~32767        C) 0~65535         D) 0~2147483647
11.设有说明:char w; int x; float y; double z;则表达式w*x+z-y值的数据类型为 D  。 (c语言中 两个不同类型的运算 要转化成同类型的 转换从低到高  char-->float-->short-->int-->double
)
A) float          B) char          C) int           D) double
12.设以下变量均为int类型,则值不等于7的表达式是    C     。
A) (x=y=6,x+y,x+1)              B) (x=y=6,x+y,y+1)    
C) (x=6,x+1,y=6,x+y)            D) (y=6,y+1,x=y,x+1)    
(二)填空题
1. 若有以下定义,则计算表达式y+=y-=m*=y后的y值是    -16

    y = -8-8
    int m=5,y=2;    m = 10   y = -8
2.  在C语言中,一个int型数据在内存中占2个字节,则 int型数据的取值范围为【2】。                 -32768----32767
3. 若s是int型变量,且s=6,则下面表达式的值为  1
s%2+(s+1)%2
0+1
4.  若a是int型变量,则下面表达式的值为  26
    (a=4*5,a*2),a+6
5. 若x和a均是int型变量,则计算表达式(1)后的x值为 12 ,计算表达式(2)后的x 值为  4。
    (1) x=(a=4,6*2)
(2) x=a=4,6*2
6.  若a是int型变量,则计算下面表达式后a的值为  2
    a=25/3%3    
7. 若x和n均是int型变量,且x和n的初值均为5,则计算表达式后x的值为___10_ ,n的值____6___。
x+=n++     x = x + n++
8.  若有定义:char c=‘\010’;则变量c中包含的字符个数为 __1__。
9. 若有定义:int x=3,y=2;float a=2.5,b=3.5;则下面表达式的值为__1___
    (x+y)%2+(int)a/(int)b
10. 已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=‘a’+‘8’-‘3’的值为___102_____。
三、简单的C程序设计
(一)选择题
1. putchar函数可以向终端输出一个   D        。
A) 整型变量表达式                      B) 实型变量值
C) 字符串                             D) 字符或字符型变量值
2. printf函数中用到格式符%5s,其中数字5表示输出的字符串占用5列。如果字符串长度大于5,则输出按方式   B    ;如果字符串长度小于5,则输出按方式    C   。
A) 从左起输出该字符串,右补空格    B) 按原字符长从左向右全部输出
C) 右对齐输出该字符串,左补空格    D) 输出错误信息
3. 阅读以下程序,当输入数据的形式为:25,13,10<CR>(注:<CR>表示回车),则正确的输出结果为    D        。
    main()
    {    int x,y,z;
         scanf(“%d%d%d”,&x,&y,&z);
         printf(“x+y+z=%d\n”,x+y+z);
    }
A) x+y+z=48      B) x+y+z=35       C) x+z=35          D) 不确定值
4. 根据下面的程序及数据的输入和输出形式,程序中输入语句的正确形式应该为    A    。
main()
    {    char ch1,ch2,ch3;
         输入语句
         printf(“%c %c %c”,ch1,ch2,ch3);
    }
    输出形式:A B C
    输入形式:A B C
A) scanf(“%c %c %c”,&ch1,&ch2,&ch3);
B) scanf(“%c,%c,%c”,&ch1,&ch2,&ch3);
C) scanf(“%c:%c:%c”,&ch1,&ch2,&ch3);
D) scanf(“%c%c”,&ch1,&ch2,&ch3);
5. 已知ch是字符型变量,下面正确的赋值语句是  BCD     。
A) ch=‘a+b’;    B) ch=‘\0’;    C) ch=‘7’+‘9’;    D) ch=5+9;
(二)填空题
1. 以下的输出结果是【1】。
main()
{    short i;
     i=-4;
     printf(“\ni:dec=%d,oct=%o,hex=%x,unsigned=%u\n”,i,i,i,i);
}

i:dec=-4,oct=4,hex=4,unsigned=4

2.  以下的输出结果是【2】。
main()
{    char c=‘x’;
     printf(“c:dec=%d,oct=%o,hex=%x,ASCII=%c,\n”,c,c,c,c);
}
c:dec=120,otc=170,hex=78,ASCII=x,
3. 以下的输出结果是【3】。
main()
{    int x=1,y=2;
     printf(“x=%d y=%d * sum * =%d\n”,x,y,x+y);
     printf(“10 Squared is : %d\n”,10*10);
}

x=1 y=2 * sum * =3
10 Squared is : 100

4.假设变量a和b均为整型,以下语句可以不借助任何变量把a、b中的值进行交换。请填空。
    a= a+_b____; b=a- _b____; a=a- _b____;
5. 若x为int型变量,则执行以下语句后的x 值为___-14______。
x=7; x+=x-=x+x;  // x=x+x=x-(x+x)  
x = x + x = 7– 14      x = -1
z=m=0xFFFF
6.  有一输入语句scanf(“%d”,k);则不能使float类型变量k得到正确数值的原因是___没有取地址符&____和___%f____。
四、选择结构
(一)选择题
1. 逻辑运算符两侧运算对象三数据类型     D       。
A) 只能是0和1                             B) 只能是0或非0正数
C) 只能是=整型或字符型数据            D) 可以是任何类型的数据
2. 判断char型变量ch是否为大写字母的正确表达式是   C    。
A) ‘A’<=ch<=‘Z’                  B) (ch>=‘A’)&(ch<=‘Z’)
C) (ch>=‘A’)&&(ch<=‘Z’)           D) (‘A’<= ch)AND(‘Z’>= ch)
3. 若希望当A的值为奇数时,表达式的值为“真”,A的值为偶数时,表达式的值为“假”。则以下不能满足要求的表达式是    C        。
    A) A%2==1        B) !(A%2==0)       C) !(A%2)          D) A%2
4. 设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后n的值为     B    。
    A) 1        B) 2        C) 3          D) 4
5. 以下程序的运行结果是   B     。
main()
{    int a,b,d=241;
     a=d/100%9;        2
     b=(-1)&&(-1);     1
     printf(“%d,%d”,a,b);
}
A) 6,1       B) 2,1       C) 6,0         D) 2,0
6. 已知int x=10,y=20,z=30;以下语句执行后x,y,z的值是  B     。
    if(x>y) 
z=x; 
x=y; 
y=z;
A) x=10, y=20, z=30                  B) x=20, y=30, z=30
C) x=20, y=30, z=10               D)  x=20, y=30, z=20</P< p>
7. 以下程序的运行结果是   C    。
main()
{    int m=5;
     if(m++>5)    
printf(“%d\n”,m);
     else;
         printf(“%d\n”,m--);
}
A) 4       B) 5        C) 6          D) 7
8. 若运行时给变量x输入12,则以下程序的运行结果是   D     。
main()
{    int x,y;
     scanf(“%d”,&x); 
     y=x>12 ? x+10 : x-12;
printf(“%d\n”,y);
}
A) 4       B) 3        C) 2          D) 0
(二)编程题
1. 编程实现:输入整数a和b,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。
2.  编程判断输入的正整数是是否既是5又是7的整倍数。若是,则输出yes;否则输出no。
3.  用switch编程实现:
?????????{ -1? ? (x<0)
?????? y =?{? 0?? (x=0)
                  {  1      (X>0)  
        
4. 用switch语句编一程序,对于给定的一个百分制成绩,输出相应的五分制成绩,设:90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’
五、循环控制
(一)选择题
1.设有程序段
 int k=10;
 while(k=0)
k=k-1;
 这下面描述中正确的是____C_____.
 a)while循环执行10次         b)循环是无限循环
 c)循环体语句一次也不执行    d)循环体语句执行一次
2.语句while(!E);中的表达式!E等价于____A____.   
  a)E==0      b)E!=1    c)E!=0       d)E==1
3.下面程序段的运行结果是____C______.
  int n=0;         0   0<=2   1     1<=2   2   2<=2  3    3<=2   4
   while(n++<=2);
printf("%d",n);
   a)2   b)3  c)4   d)有语法错
4.下面程序的运行结果是___C_____.
    #include<stdio.h>
    main()
     {
     int num=0;
     while(num<=2)  
      {
      num++;                    3
      printf("%d\n",num);       3
      }
     }
a)1       b)1         c)1       d)1
              2           2         2
                          3         3
                                    4
5.以下程序段___C_____.
 x=-1;
   do
{
    x=x*x;      1
   }while(!x);
 a)是死循环              b)循环执行二次
 c)循环执行一次          d)有语法错误
6.若有如下语句
   int x=3;
   do
{
printf(""%d\n",x-=2);     X = 0 - 2
}while(!(--x));      -3      
 则上面程序段__B____.
  a)输出的是1   b)输出的是1和-2  c)输出的是3和0  d)是死循环
7.下面程序的运行结果是__D___.
  #include<stdio.h>
main()
{
int y=10;
    do
{
y--;          9    7   5   3    1
}while(--y);     8    6   4   2    0
   printf("%d\n",y--);
}
  a)-1   b)1   c)8   d)0
8.若i为整型变量,则以下循环执行次数是__B___.
  for(i=2;i==0;)        
printf("%d",i--);       
   a)无限次   b)0次     c)1次   d)2次
9.执行语句for(i=1;i++<4; );后变量i的值是__C____.
  a)3   b)4   c)5     d)不定       1<4  2   2<4  3  3<4  4  4<4  5
10.以下正确的描述是__B_____.
  a)continue语句的作用是结束整个循环的执行
  b)只能在循环体内和switch语句体内使用break语句
  c)在循环体内使用break语句或continue语句的作用相同
  d)从多层循环嵌套中退出时,只能使用goto语句</P< p>
(二)、填空题
1.下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束
循环。请填空。
  int n=0,c;
  c=getchar();
  while(_c != ‘\n’_____)
   {
   if(c >= ‘0’ &&   c <= ‘9’)n++;
    c=getchar();
   }

2.下面程序的功能是用"辗转相除法"求两个正整数的最大公约数。请填空。

  #include  <stdio.h>             
  main()
  {
int r,m,n;
   scanf("%d%d",&m,&n);                       获取用户输入的m,n的值
   if(m<n)__n = n - m_____;                 246    48
   r=m%n;     246%48      r = 6
   while(r)
{
m=n;                    48    
n=r;                    6
r=__m%n____;
}           
   printf("%d\n",n);
  }

3.下面程序的运行结果是__ 254_______.
  #include <stdio.h>
  main()
 {
int a,s,n,count;
   a=2;s=0;n=1;count=1;
  while(count<=7)
{
n=n*a;        2    4    8    16   32   64     128
s=s+n;       2    6    14   30   62   126    254
++count;     2    3    4    5    6    7      8
}
  printf("s=%d",s);
 }

4.下面程序段的运行结果是___-5______.
 i=1;a=0;s=1;
 do
{
a=a+s*i;      1   -1   2    -2    3    -3   4    -4   5    -5
s=-s;      -1    1   -1     1    -1    1    -1    1   -1
i++;       2     3   4     5    6    7     8     9     10    11
}while(i<=10);  
 printf("a=%d",a);
5.下面程序段的运行结果是__8____.
   i=1;s=3;
   do
{                        s     i
s+=i++;     s = s + i++;     18    6
      if(s%7==0) 
continue;
      else 
++i;
     }while(s<15);
   printf("%d",i);

s = 4  i=2 i=3   s=7 i=4  s=11 i=5 i=6  s=17 i=7 i=8  
六、数组
(一)选择题
1.以下为一维整型数组a的正确说明是_________.
  a)int a(10);              b)int n=10,a[n];
  c)int n;                  d)#define SIZE 10;
    scanf("%d",&n);           int a[SIZE];
    int a[n];

2.以下对二维数组a的正确说明是________.
  a)int a[3][];               b)float a(3,4);
  c)double  a[1][4]           d)float a(3)(4);

3.若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为______.
(假设a[0][0]位于数组的第一个位置上。)
  a)i*m+j     b)j*m+i   c)i*m+j-1    d)i*m+j+1

4.若二维数组a有m列,则在a[i][j]前的元素个数为________.
  a)j*m+i     b)i*m+j    c)i*m+j-1   d)i*m+j+1

5.25.若有以下程序段:
    。。。 。。。
int a[]={4,0,2,3,1},i,j,t;
   for(i=1;i<5;i++)
    {t=a[i];j=i-1;
      while(j>=0&&t>a[j])
        {a[j+1]=a[j];j--;}
      a[j+1]=t;}
   ... ...
 则该程序段的功能是_________.
   a)对数组a进行插入排序(升序)
   b)对数组a进行插入排序(降序)
   c)对数组a进行选择排序(升序)
   d)对数组a进行选择排序(降序)
?
6.有两个字符数组a、b,则以下正确的输入语句是_______.
  a)gets(a,b);                 b)scanf("%s%s",a,b);
  c)scanf("%s%s",&a,&b);       d)gets("a"),gets("b");
?
7.下面程序段的运行结果是_________.
  char a[7]="abcdef";
char b[4]="ABC";
  strcpy(a,b);
  printf("%c",a[5]);
  a)空格     b)\0    c)e     d)f
?
8.判断字符串s1是否大于字符串s2,应当使用_______.
   a)if(s1>s2)                b)if(strcmp(s1,s2))
   c)if(strcmp(s2,s1)>0)      d)if(strcmp(s1,s2)>0)
?
9.下面程序的功能是从键盘输入一行字符,统计其中有多少个单词,单词之间用
空格分隔,请选择填空。
   #include <stdio.h>
   main()
   {
    char s[80],c1,c2='';
    int i=0,num=0;
    gets(s);
    while(s[i]!='\0')
     {c1=s[i];
      if(i==0)c2='';
      else c2=s[i-1];
      if(__C_)num++
      i++;
     }
printf("There are %d words.\n",num);
}
  a)c1==''&&c2==''     b)c1!=''&&c2==''
  c)c1==''&&c2!=''     d)c1!=''&&c2!=''
?
10.下面程序的运行结果是________.
  #include <stdio.h>
 main()
  {char str[]="SSSWLIA",c;
    int k;
    for(k=2;(c=str[k])!='\0';k++)
     {switch(c)
       {case 'I':++k;break;
        case 'L':continue;
        default:putchar(c);continue;
       }
      putchar('*');
   }
}  
 a)SSW*    b)SW*    c)SW*A     d)SW</P< p>
(二)填空题
1. 若有定义:double x[3][5];则x数组中行下标的下限为________,列下标的上限为_________.
2.下面程序以每行4个数据的形式输出a数组,请填空。
  #define N  20
  main()
   {int a[N],i;
   for(i=0;i<N;i++)scanf("%d",_______);
   for(i=0;i<N;i++)
   {if  (_______)    _____________
    printf("%3d",a[i]);
   }
 printf("\n");
}

3. 下面程序可求出矩阵a的主对角线上的元素之和,请填空。
 main()
  {int a[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;
  for(i=0;i<3;i++)                                 1   3   5
   for(j=0;j<3;j++)                                7   9   11
     if(_________)sum=sum+_______;        13  15  17
    printf("sum=%d\n",sum);
}
4. 当从键盘输入18并回车后,下面程序的运行结果是________.
 main()                                     
  {int x,y,i,a[8],j,u,v;
   scanf("%d",&x);         x=18
   y=x;i=0;                y=18  i=0
   do
   {u=y/2;              u=9      u=4      u=2      u=1     u=0
    a[i]=y%2;           a[0]=0   a[1]=1   a[2]=0   a[3]=0  a[4]=1
    i++;y=u;            i=1 y=9  i=2 y=4  i=3 y=2  i=4 y=1 i=5 y=0
    }while(y>=1)           
   for(j=i-1;j>=0;j--)      j=4     j=3  …
     printf("%d",a[j]);       
?
5. 下面程序用插入法对数组a进行降序排序。请填空。
  main()
  {int a[5]={4,7,2,5,1};
    int i,j,m;
   for(i=1;i<5;i++)
     {m=a[i];               m=a[1]
      j=_i-1___;               
      while(j>=0&&m>a[j])    a[i]<a[j]---  
      {_______    
________;
          j--;
       }
    
   }
    for(i=0;i<5;i++)
     printf("%d",a[i]);
    printf("\n");
}
?
6. 下面程序的功能是在三个字符串中找出最小的,请填空。
 #include<stdio.h>
 #include<string.h>
  main()
 {char s[20],str[3][20];
 int i;
  for(i=0;i<3;i++)gets(str[i]);
 strcpy(s,_______);
  if(strcmp(str[2],s)<0)strcpy(s,str[2]);
  printf("%s\n",_______);
 }
?
7. 下面程序的运行结果是________.
  #include<stdio.h>
  main()
  {char s[]="ABCCDA";
    int k;char c;
   for(k=1;(c=s[k])!='\0';k++)
    {switch(c)
      {case 'A':putchar('%');continue;
       case  'B':++k;break;
       default:putchar('*');
case  'C':putchar('&');continue;
     }
   putchar('#');
   }
}
七、函数
(一)选择题
1.以下正确的说法是_________.
 建立函数的目的之一是   a)提高程序的执行效率
                        b)提高程序的可读性
                        c)减少程序的篇幅
                        d)减少程序文件所占内存

2.以下正确的函数定义形式是__C______.
  a)double fun(int x,int y)
  b)double fun(int x; int y)
  c)double fun(int x, int y);
  d)double  fun(int x,y);

3.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式为__B____.
 A)地址传递
 B)单向值传递
 C)由实参传给形参,再由形参传回给实参
 D)由用户指定传递方式

4.已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array
的错误定义方式为_____D___.
   int a[3][4];
   f(a);
   a)f(int array[][6])
   b)f(int array[3][])
   c)f(int array[][4])
   d)f(int array[2][5])

5.以下程序的正确运行结果是_____C____.
  #include <stdio.h>
  void num()
{extern int x,y;int a=15,b=10;
   x=a-b;                 x=15-10=5;
   y=a+b;                 y=15+10=25
  }
 int x,y;
 main()
 {
  int a=7,b=5;      
   x=a+b;                 x=7+5=12
   y=a-b;                 y=7-5=2
  num();
  printf("%d,%d\n",x,y);
 }
a)12,2    b)不确定   c)5,25   d)1,12
(二)填空题
1.以下程序的运行结果是__2___.
  #include<stdio.h>
  main()
  {int a=1,b=2,c;
   c=max(a,b);      c=b=2
   printf("max is %d\n",c);
   }
  max(int x,int y)
  {int x;   
   z=(x>y)?x:y;   z的值为x , y 中较大的值
   return(z);
  }

2.函数gongyu的作用是求整数num1和num2的最大公约数,并返回该值。请填空。
  gongyu(int num1,int num2)
  {int temp,a,b;
   if(num1(__>___) num2)
    {temp=num1;num1=num2;num2=temp;}
   a=num1;b=num2;
   while(_a%b != 0___)
    {temp=a%b;a=b;b=temp;}
   return(b);
}

3.以下程序的运行结果是____A+B=9____.
   int a=5;int  b=7;
   main()
  { int a=4,b=5,c;
    c=plus(a,b);                 //c = 9 局部变量起作用
    printf("A+B=%d\n",c);
   }
  plus(int x,int y)
   {int z;
     z=x+y;      //z的值为x, y 之和
     return(z);
   }

4.以下程序的运行结果是_______.
 main()
 {incx();    x=1
  incy();    y=1
  incx();    x=1
  incy();    y=2
  incx();    x=1
  incy();    y=3
 }
 incx()
  {
  int x=0;
  printf("x=%d\t",++x);
}
incy()
 {static int y=0;     //static修饰变量时 只有第一次初始化起作用 
  printf("\ny=%d\n",++y); 
}
(三)编程题
1.??? 已有变量定义和函数调用语句:int x=57 ; isprime(x); 函数isprime( ) 用来判断一个整形数a是否为素数,若是素数,函数返回1,否则返回0。请编写isprime函数。
#include <math.h>
        isprime(int a)
        { int x,y,i;
          y=1;
          x=sqrt(a+1);
          for(i=2;i<=x;i++)

  if(a%i == 0)
  {
    y = 0;
}
}
return y;     
       }

2.??? a是一个2X4的整型数组,且各元素均已赋值。函数max_value可求出其中的最大的元素值max,并将此值返回主调函数。今有函数调用语句max=max_value(a),请编写max_value函数。
        max_value(int arr[ ][4])
        {                }
八、编译预处理
(一)选择题
1.以下叙述中正确的是________.
 a)在程序的一行上可以出现多个有效的预处理命令行
 b)使用带参的宏时,参数的类型应与宏定义时的一致
 c)宏替换不占用运行时间,只占用编译时间
 d)在以下定义中C   R是称为“宏名”的标识符
   #define   C   R   045

2.以下程序的运行结果是____B____.
  #define  MIN(x,y)  (x)<(y)?(x):(y)        
  main()
  {int i=10,j=15,k;       
   k=10*MIN(i,j);      //k=10*(i)<(j)?(i):(j)  100<15?100:15   k=15
   printf("%d\n",k);
  }
   a)10   b)15   c)100   d)150

3.若有宏定义如下:
   #define   X    5         
   #define   Y    X+1
   #define   Z   Y*X/2
  则执行以下printf语句后,输出结果是____D___.
    int a;a=Y;              a=X+1=5+1=6
    printf("%d\n",Z);       z=X+1*X/2=5+1*5/2=7
    printf("%d\n",--a);     --a   = 5
  a)7       b)12      c)12      d)7
    6          6         5        5

4.请读程序:
  #include <stdio.h>
#define  MUL(x,y)  (x)*y
  main()
  {
   int a=3,b=4,c;
   c=MUL(a++,b++);          c=(a++)*b++=3*4=12
   printf("%d\n",c);
  }
  上面程序的输出结果是_____A____.
  a)12   b)15    c)20       d) 16
?
5.对下面程序段:
  #define A 3
  #define  B(a) ((A+1)*a)
  ...
  x=3*(A+B(7));      x=3*(A+((A+1)*7))=3*(3+(4*7))=3*31=93
 正确的判断是____B_____.
  a)程序错误,不许嵌套宏定义
  b)x=93
  c)x=21
  d)程序错误,宏定义不许有参数
?
九、指针
(一)选择题
1.变量的指针,其含义是指该变量的___B______.
  a)值              b)地址
  c)名              d)一个标志

2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是 D__.
  a)a,point,*&a             b)&*a,&a,*point            int *point = a;
  c)*&point,*point,&a       d)&a,&*point ,point

3.若有说明;int *p,m=5,n;以下正确的程序段的是___C_____.
 a)p=&n;               b)p=&n;                    
   scanf("%d",&p);       scanf("%d",*p);
 c)scanf("%d",&n);      d)p=&n;   
   *p=n;                  *p=m;   

4.下面程序段的运行结果是____C_____.
  char *s="abcde";                   s=s+2    
  s+=2;printf("%d",s);
  a)cde     b)字符'c'     c)字符'c'的地址     d)无确定的输出结果

5.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确
执行的赋值语句是___BD_____.
a)c=*p1+*p2;    b)p2=c    c)p1=p2      d)c=*p1*(*p2);

6.以下正确的程序段是__B_______.
  a)char str[20];                    b)char *p;
    scanf("%s",&str);                  scanf("%s",p);
  c)char str[20];                    d)char str[20],*p=str;
    scanf("%s",&str[2]);               scanf("%s",p[2]);

7.若有说明语句
   char a[]="It is mine";         
   char *p="It is mine";
  则以下不正确的叙述是__D_____.
  a)a+1表示的是字符t的地址          a+1=&a[0]+1 &a[1]
  b)p指向另外的字符串时,字符串的长度不受限制    
  c)p变量中存放的地址值可以改变      
  d)a中只能存放10个字符     最少都需要11个字符    \0

8.下面程序的运行结果是___-1____.
  #include  <stdio.h>
  #include  <string.h>
  main()
  {
    char *s1="AbDeG";          
    char *s2="AbdEg";
    s1+=2;s2+=2;               s1=s1+2 指向D    s2+=2指向d
   printf("%d\n",strcmp(s1,s2));    不相同
  }
  a)正数    b)负数   c)零   d)不确定的值

9.下面程序的运行结果是_______.
  #include  <stdio.h>
  #include  <string.h>
  fun(char *w,int n)
   {char t,*s1,*s2;         
    s1=w;s2=w+n-1;                  s1<s2   w<w+n-1    n-1>0   n>1
    while(s1<s2){t=*s1++;*s1=*s2--;*s2=t;}      t=*s1++   t=*s1 s1++    
  }                                             *s1=*s2--   
  main()
{char *p;                            
  p="1234567";
  fun(p,strlen(p));       
  puts(p);
  }

a)7654321   b)1714171   c)1711717   d)7177171

10.若有以下定义,则对a数组元素的正确引用是_________.
 int a[5],*p=a;
 a)*&a[5]   b)a+2  c)*(p+5)  d)*(a+2)

11.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______.
  a)*(a[i]+j)   b)(a+i)   c)*(a+j)  d)a[i]+j

12.若有以下定义,则p+5表示_______.
  int  a[10],*p=a;
  a)元素a[5]的地址             b)元素a[5]的值
  c)元素a[6]的地址             d)元素a[6]的值
(二)填空题
1.以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。
请填空。
  #include "stdlib.h"
  main()
  {int *a,*b,*c,num,x,y,z;   
   a=&x;b=&y;c=&z;                     *a=x  *b=y  *c=z    
   printf("输入3个整数:");           
   scanf("%d%d%d",a,b,c);              从用户获取x,y,z的值
   printf("%d,%d,%d\n",*a,*b,*c);      输出x,y,z的值
   num=*a;                             num=x
   if(*a>*b)___ num=*b ___;            if(x>y)  num=*b;
   if(num>*c)__ num=*c ____;           if(x>z)  num=*c
   printf("输出最小整数:%d\n",num);    num为最小值
  }

2.下面程序段的运行结果是__hELLO!______.
  char s[80],*sp="HELLO!";          
  sp=strcpy(s,sp);                  把sp中内容拷到s中
  s[0]='h';                   
  puts(sp);
  
3.下面程序段的运行结果是___ef_____.
  char str[]="abc\0def\0ghi",*p=str;      
  printf("%s",p+5);

4.下面程序的功能是将两个字符串s1和s2连接起来。请填空。
   #include<stdio.h>
  main()
  {char s1[80],s2[80];    
  gets(s1); gets(s2);              获取用户输入2个字符串
   conj(s1,s2);                    
   puts(s1);
  }
  conj(char *p1,char *p2)
    {char *p=p1;                     
   while(*p1)_p++_____;
   while(*p2){*p1=______;p1++;p2++;}
   *p1='\0';
   __________;
  }

5.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是______. *(a+5)的值是_________.
6.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____. *(*(a+1)+0))的值是________.
7.以下程序将数组a中的数据按逆序存放,请填空。
  #define M 8
  main()
  {int a[M],i,j,t;     
   for(i=0;i<M;i++)scanf("%d",a+i);    通过用户输入得到数组a[M]
   i=0;j=M-1;     
   while(i<j)
    {
     t=*(a+i);________;*(_______)=t;
     i++;j--;
     }
  for(i=0;i<M;i++)printf("%3d",*(a+i));
 }

8.若有定义:int a[3][5],i,j;(且0<=i<3,0<=j<5),则a数组中任一元素可用
五种形式引用。它们是:
  (1)a[i][j]
  (2)*(a[i]+j)
  (3)*(*______);
  (4)(*(a+i))[j]
   (5)*(____+5*i+j)

9.下面程序的运行结果是_________.
  main()
  {char *a[]={"Pascal","C language","dBase","Coble"};
   char (**p)[];
   int j;
   p=a+3;
   for(j=3;j>=0;j--)printf("%s\n",*(p--));
  }
十、结构体与共同体
(一)?选择题
1.C语言结构体类型变量在程序执行期间_________.
   a)所有成员一直驻留在内存中
   b)只有一个成员驻留在内存中
   c)部分成员驻留在内存中
   d)没有成员驻留在内存中

2.下面程序的运行结果是____D_______.
  main()
 {
   struct cmplx{int x;
                int y;
               }cnum[2]={1,3,2,7};
     printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);  3/1*2=6
}
  a)0      b)1    c)3    d)6

3.设有如下定义:
  struct  sk
   {int n; 
    float  x;
   }data ,*p;
  若要使p指向data中的n域,正确的赋值语句是___c____.
  a)p=&data.n;
  b)*p=data.n;
  c)p=(struct sk *)&data.n;
  d)p=(struct sk *)data.n;

4.以下对结构体变量stu1中成员age的非法引用是________.
struct  student
  {int age;
   int num;
  }stu1,*p;
 p=&stu1;
  a)stu1.age        b)student.age
  c)p->age          d)(*p).age

5.下面对typedef的叙述中不正确的是______.
  a)用typedef可以定义各种类型名,但不能用来定义变量
  b)用typedef可以增加新类型
  c)用typedef只是将已存在的类型用一个新的标识符来代表
  d)使用typedef有利于程序的通用和移植

6.以下scanf函数调用语句中对结构体变量成员的不正确引用是________.
   struct  pupil
    {char name[20];
      int age;
      int sex;
    }pup[5],*p;
    p=pup;
   a)scanf("%s",pup[0].name);
   b)scanf("%d",&pup[0].age);
   c)scanf("%d",&(p->sex));
   d)scanf("%d",p->age);
(二)填空题
1.以下程序的运行结果是________.
 struct n{
    int x;
    char c;
   };
main()
  {struct n a={10,'x'};
  func(a);
   printf("%d,%c",a.x,a.c);
  }
func(struct n b)
  {
  b.x=20;
  b.c='y';
  }

2.若有定义:
  struct  num
  {int a;
    int b;
    float  f;
   }n={1,3,5.0};
  struct num *pn=&n;
  则表达式pn->b/n.a*++pn->b的值是________,表达式(*pn).a+pn->f的值是________.

3. 以下程序的运行结果是________.
struct ks
  {int a;
   int *b;
  }s[4],*p;
  main()
  {
   int n=1;
  printf("\n");
  for(i=0;i<4;i++)
   {
     s[i].a=n;
     s[i].b=&s[i].a;
     n=n+2;
   }
  p=&s[0];
  p++;
  printf("%d,%d\n",(++p)->a,(p++)->a);
}

4.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名
和年龄。请在_______内填入正确内容。
 stati struct man{
    char name[20];
     int age;
  }person[]={"li=ming",18,
             "wang-hua",19,
              "zhang-ping",20
             };

main()
  {struct man *p,*q;
   int old=0
   p=person;
  for(  ;p_____;p++)
    if(old<p->age)
     {q=p;______;}
   printf("%s %d",______);
}

5. 以下程序段的功能是统计链表中结点的个数,其中first为指向第一个结点
的指针(链表不带头结点)。请在______内填入正确内容。
struct link
  {char data ;
   struct link *next;
  };

....
  struct link *p,*first;
  int c=0;
  p=first;
  while(_____)
   {_______;
    p=_______;
  }
十一、位运算
(一)? 选择题
1.以下运算符中优先级最低的是____C___.以下运算符中优先级最高的是____B___.优先级是& > | > && > ||。

  a)&&       b)&   c)||   d)|

2.若有运算符<<,sizeof,^,&=则他们按优先级由高到低的正确排列次序是____.
  a)sizeof,&=,<<,^             b)sizeof,<<,^,&=
  c)^,<<,sizeof,&=             d)<<,^,&=,sizeof

3.sizeof(float)是______.
  a)一种函数调用            b)一个不合法的表示形式
  c)一个整型表达式          d)一个浮点表达式

4.以下叙述中不正确的是__________.
  a)表达式a&=b等价于a=a&b
  b)表达式a|=b等价于a=a|b
  c)表达式a!=b等价于a=a!b
  d)表达式a^=b等价于a=a^b

5.若x=2,y=3,则x&y的结果是_________.
 a)0     b)2     c)3       d)5

6.在位运算中,操作数每左移一位,则结果相当于________.
   a)操作数乘以2       b)操作数除以2
   c)操作数除以4       d)操作数乘以4

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bryan Ding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值