• C语言错题笔记


    仔细理解

    一、C语言

    1、数据类型表达式练习题

    1. 表达式 (3== x ==3) 的值恒为0。(T)

    2. 函数的声明包括函数首部和函数体两部分。(F)

    3. C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。(T)

    4. 下列叙述中正确的是( D )
       A.每个C程序文件中都必须要有一个main()函数
       B.在C程序中main()函数的位置是固定的
       C.C程序中所有函数之间都可以相互调用,与函数所在位置无关
       D.在C程序的函数中不能定义另一个函数

    5. 下列选项中用于判断ch是否是字符的表达式是( D )。 (2分)
      A.( ‘a’ <= ch <= ‘z’ ) || ( ‘A’ <= ch <= ‘Z’ )
      B.( ‘a’ <= ch <= ‘z’ ) && ( ‘A’ <= ch <= ‘Z’ )
      C.( ch >= ‘a’ && ch <= ‘z’ ) && ( ch >= ‘A’ && ch <= ‘Z’ )
      D.( ch >= ‘a’ && ch <= ‘z’ ) || ( ch >= ‘A’ && ch <= ‘Z’ )

    6. 逻辑运算符两侧运算对象的数据类型( D )。 (2分)
      A.只能是 0 或 1
      B.只能是 0 或非 0 正数
      C.只能是整型或字符型的数据
      D.可以是任何类型的数据

    7. 假定x和y为 double型,则表达式x=2,y=x+3/2的值是( C )。 (2分)
      A.3.500000
      B.3
      C.3.000000
      D.2.000000

    8. 有以下程序
      注意符号优先级
      #include
      void main()
      { int x, y, z;
      x=y=1;
      z=x++,y++,++y;
      printf(“%d,%d,%d\n”,x,y,z);}
      程序运行后的输出结果是( C )。
      A. 2,3,3 B. 2,3,2 C. 2,3,1 D. 2,2,1

    9. 若变量已正确定义并赋值,下面符合C语言语法的是 ( B )
      C重复定义了
      A.int a=int(i) B. a=b=c+2 C. int a=b=3; D. a=a+7=c+b

    2、选择练习

    1. if(a=5) 是允许的。(T)

    2. break语句只能用于循环语句中。 (F)可用在switch选择结构中

    3. 如果变量已经正确定义,则执行以下程序段后,x的值不变。(F)

      x = 4; 
      if (x < 0){ 
          y = -1;
      }else if (x = 0){
          y = 0;
      }else{ 
          y = 1;
      }  
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    4. 下列程序段的输出结果是( C )。 (2分)
      else总是与离它最近的if配对

      int main(void)
      {   
            int  a = 2, b = -1, c = 2;
      
            if(a < b)
                  if(b < 0)  
                        c = 0;
            else  c++;
            printf("%d\n",c);	
            return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      A.0 B.1 C.2 D.3

    5. 下列程序段输出结果为 ( B )。
      注意选择语句或者循环语句后面的;(分号)

      int x = -3, y = 2;
      if(x>y);
          x = -x;
      if(x<y)
          y = -y;
      printf("x=%d,y=%d\n", x, y);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      A.x=3,y=-2
      B.x=3,y=2
      C.x=-3,y=2
      x=-3,y=-2

    6. 若a、b、c1、c2、x、y均是整型变量,以下正确的switch语句是 ( D )
      A.
      ()后面有分号

      switch(a+b);
      {    case 1: y=a+b; break;
        case 0:y=a-b; break;}
      
      • 1
      • 2
      • 3

      B.

      switch(a*a+b*b)
      {
      case 3:
      case 1: y=a+b; break;
      case 3: y=b-a, break;}
      
      • 1
      • 2
      • 3
      • 4
      • 5

      C.

      switch a
      {    case c1: y=a-b; break;
      case c2: x=a*b; break;
      default: x=a+b; }
      
      • 1
      • 2
      • 3
      • 4

      D.

      switch(a-b)
      {    default: y=a*b; break;
      case 3: case 4: x=a+b; break;
      case 10: case 11: y=a-b; break; }
      
      • 1
      • 2
      • 3
      • 4
    7. 以下程序统计输入的一行字符中字母、数字、空格、其它字符的个数(行末以换行符结束,最后的换行符不统计在内)。例如,输入的一行字符为aB 3*则字母有2个,数字有1个,空格有1个,其它字符有1个。
      提示:1、填写的代码要确保程序可以正确编译、运行得出结果;2、空格之后的括号里注明了分数,该括号不属于代码部分。

      #include 
      int main(){
          int letters, digits, spaces, others;
          (2);
          char ch;//(ch=getchar())!=’\n’ putchar(ch)!=’\n’
          while( (2) ){
              if( (2) )
                  letters++;
              else if( (2) )
                  digits++;
              else if( (2) )
                  spaces++;
              else
                  others++;
          }
          printf("字母、数字、空格、其它字符分别有:%d %d %d %d 个\n",letters,digits,spaces,others);
      }
      letters=0;digits=0;spaces=0;others=0
      (ch=getchar())!=’\n’
      (ch>'a'&&ch<'z')||(ch>'A'&&ch<'Z')
      ch>=0&&ch<=9
      ch==' '
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    8. 列程序段将输出__*2*#*3*#_。
      注意case 1:后面没有break;所以要执行下面的代码包括default

      unsigned char x=255,y='\1';
      switch(!!x) {
          case 0: printf("*0*#");break;
          case 1:
          switch(y)	{
              case 0: printf("*1*#");break;
              case 1: printf("*2*#");break;
          }
          default: printf("*3*#");
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    3、循环练习

    1. 要提前结束循环的执行,可以使用 break 语句。

    2. 在多层循环中, 一个break语句只向外跳一层。(T)

    3. 只能在循环体内和switch语句体内使用break语句。(T)

    4. 第一段用for语句实现的循环,一定等价于第二段用while语句实现的循环(两个循环中省略的代码相同)。(F)
      注意当省略的代码中有continue时,while循环中的i++会失效,而for循环中的i++仍然执行

      	for(i=0;i<100;i++)
          /**
           此处省略代码若干行
           **/
      	int i=0;
      	while(i<100){
          /**
           此处省略代码若干行
           **/
          i++;
      	}
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    5. 执行以下程序段,sum的值是55。(F)
      注意sum没有初始化,是一个随机数

      int i, sum;
      for (i = 1; i <= 10; i++){
          sum = sum + i;
      }
      
      • 1
      • 2
      • 3
      • 4
    6. 以下程序段的功能是计算20的阶乘。(F)
      product = 0

      int i;
      double product;
      product = 0;
      for (i = 1; i <= 20; i++){ 
         product = product * i;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    7. 若变量已正确定义,以下while循环结束时,i的值为11。(F)
      注意本函数中没有i++

      i = 1;
      while (i <= 10){
          printf("%d\n", i);
      }
      
      • 1
      • 2
      • 3
      • 4
    8. do - while语句的一般形式如下,第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do - while的下一条语句。(T)

      do{
          循环体语句
      }while(表达式);
      
      • 1
      • 2
      • 3
    9. 执行以下程序段,将出现死循环。
      注意两个循环中的i相互影响

      for(i = 11; i <= 20; i++){ 
          for(i = 1; i <= 10; i++){
              printf( "%4d", i );
          }
          printf("\n"); 
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    10. 以下两个程序段等价,其功能是计算 s=1+2+…+10。(T)

      /* 程序段A*/
      s = 0;
      i = 1;
      while(i <= 10){
          s = s + i;
          i++;
      }
      /* 程序段B */
      s = 0;
      i = 1;
      while(1){
          if(i > 10){
              break;
          }
          s = s + i;
          i++;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    11. 以下两个程序段等价,其功能是计算 s=1+3+5+7+9。(T)

      /* 程序段A*/
      s = 0;
      i = 0;
      while(i < 10){
          i++;
          if(i % 2 == 0){
              continue;
          }
          s = s + i;
      }
      /* 程序段B */
      s = 0;
      i = 0;
      while(i < 10){
          i++;
          if(i % 2 != 0){
               s = s + i;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

    4、数组练习

    1. 调用strcmp函数比较字符串大小时,通常较长的字符串会较大。 ( F )
      字符串比较规则是:将两个字符串自左至右逐个字符相比(按照ASCII码值大小比较,小写字母比大写字母大),直到出现不同字符或遇到’\0’为止

    2. 以下定义语句中不正确的是_D_。 (2分)
      注意:可以定义实型数组
      A.double x[5]={2.0, 4.0, 6.0, 8.0, 10.0};
      B.char c2[]={‘\x10’, ‘\xa’, ‘\x8’};
      C.char c1[]={‘1’, ‘2’, ‘3’, ‘4’, ‘5’};
      D.int y[5]={0,1,3,5,7,9};

    3. 有两个字符数组a,b,则以下正确的输入语句是。( B )
      A.gets(a,b);
      B.scanf(“%s%s”,a,b);
      C.scanf(“%s%s”,&a,&b);
      D.gets(“a”),gets(“b”);

    4. 删除字符串中的空格(使用1个数组)。
      以下程序段的功能是:将字符串str中的所有空格都删除。

      int i, j
      char str[81];
      
      i = j = 0;
      while (str[i] != '\0') {
          if(1){
              str[j] = str[i];
              (1)
          }
          i++;
      }
      (1)
      str[i]!=' '
      j++
      str[j]='\0';
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

    5、指针练习

    1. 执行语句int *p=1000;后,指针变量p指向地址为1000的变量。 ( F )

    2. 调用printf函数,%s的格式输出字符串时,字符数组名、字符指针和字符串常量都可以作为输出参数。 ( T )

    3. 下面程序的输出结果是( D )。
      注意:区分形参x,y和实参x,y

      #include
      void fun (int *x, int y){
      printf("%d%d", *x, y);// &2 1
      *x=3;  y=4; //x=3 y=1
      }
      int main(void){
      int x=1,y=2;  // x=1 y=3
      fun(&y, x);//  
      printf("%d%d", x, y);
      return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

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

    4. 以下程序的运行结果是( D )。

      #include       
      void sub(int x, int y, int *z)
      {  *z = y-x; }
      int main()
      {    int a,b,c;
           sub(10, 5, &a);//-5
           sub(7, a, &b);// -12
           sub(a, b, &c);//-17
           printf(%d,%d,%d\n”, a,b,c);
           return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      A.5,2,3
      B.-5,-12,-7
      C.-5,-12,-17
      D.5,-2,-7

    5. 以下程序运行后输入“3,abcde<回车>”,则输出结果是。cedba
      注意调用move函数的次数是3

      #include 
      #include 
      void move(char* str, int n) {
      	char temp;
      	int i;
      	temp = str[n - 1]; //temp=str[4]=e
      	for (i = n - 1; i > 0; i--) //i=4
      		str[i] = str[i - 1];//str[4]=str[3]
      	str[0] = temp; //     eabcd deabc cdeab
      }
      int main()
      {
      	char s[50];
      	int n, i, z;
      	scanf("%d,%s", &n, s);  //n=3 s=abcde
      	z = strlen(s); //z=5
      	for (i = 1; i <= n; i++) //1 2 3
      		move(s, z); //abcde 5
      	printf("%s\n", s);
      	return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    6. 写出下列程序的执行结果 (1分) 4 6
      注意在for循环中不满足循环条件时,i的大小

      #include 
      int main(void)
      {
        int a[10], b[10], *pa, *pb, i;
        pa = a;
        pb = b;
        for( i=0; i<3; i++, pa++, pb++)
        { *pa = i;//pa[0]=0 pa[1]=1 pa[2]=2
          *pb = 2*i;//pb[0]=0 pb[1]=2 pb[2]=4
         }
        pa = &a[0];//0 1 2
        pb = &b[0];//0 2 4
        for ( i=0; i<3; i++,pa++,pb++)//此时pa pb已经+了3次
        {
          *pa = *pa + i;//0 2 4
          *pb = *pb + i;//0 4 6
         }
         printf("%d %d\n", *--pa, *--pb);
         return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
    7. 下面程序段的运行结果是 (2分) 。6 6 7
      ++*p == >*p=*p+1 所以 *p的值也会改变

        int i,j,k=5, *p;
        p= &k;
        i= ++(*p);//6   相当于*p=*p+1  p指向k的值已经改变
        j=(*p)++;//6
        printf("%d %d %d",i,j,k) ;
      
      • 1
      • 2
      • 3
      • 4
      • 5
  • 相关阅读:
    ZETA与RFID在供应链物流场景中是否可以互补?
    计算机毕业设计Java在线选课系统设计(系统+程序+mysql数据库+Lw文档)
    flutter 嵌套 StatefulWidget 不刷新
    Flink Kylinv10 java8 Flink镜像制作
    电脑上可以写便签的软件哪些界面比较可爱且好用?
    一幅长文细学Vue(六)——组件高级(下)
    二、数据库查询语句(多表查询篇)
    深入浅出Java多线程(九):synchronized与锁
    [附源码]java毕业设计在线开放课程平台
    Chapter1 Regression
  • 原文地址:https://blog.csdn.net/qq_52108058/article/details/128170505