【C语言】我的错题集

题目1:

若给定条件表达式 (M)?(a++):(a--) ,则其中表达式 M (
A: 和(M==0)等价 B: 和(M==1)等价 C: 和(M!=0)等价 D: 和(M!=1)等价

 解析:条件表达式

给了一个表达式,M表示的是:是否为真或是否为假;在C语言中真假判断依据就是:非零为真,零为假;(我做这道题的时候不是知道M表示什么。


题目2:

如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( AB

int gcd(char x,char y)
{
 int min = x < y ? x : y;
 for (min = 0; min > 0; min--)
   if (x % min = 0 && y % min = 0)
     return min;
}


A: 参数类型不对 B: 循环变量min初值不对 C: 判断等于的符号不对 D: 返回类型不对

 解析:最大公约数

A:题目要求是int类型,但是这里的参数是char类型;B:min = 0;min > 0;条件是这样,都不会执行循环(%操作符不可以模0);C:在if语句中是判断是否等于0,而不是进行赋值语句;

对这个求最大公约数的函数不了解,自己没有认真去分析。赋值符(=)和 判断符(==)总是一扫而过注意不到,往往错误就是不细心导致的。


题目3:

下列 for 循环的次数为( D

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


A: 0 B: 5 C: 1 D: 无限

 解析:循环次数

在for循环中,i 每一次都会被重新初始化为 0; i || i++ < 5 判断是否循环,i++ < 5为真,所以会一直循环。|| 按位与操作符:只要一个为真则为真;i++ 会改变 i 的值;(我做这道题的时候选的也是D,但是我并不确定 i++ 是否会改变 i 的值,也忽略了每一次 i 都会重新初始化为 0


题目4:

执行下面的程序段,语句3的执行次数为( C

for(i = 0; i <= n-1; i++)  // (1)
  for(j = n; j > i; j--)  // (2)
    state;        // (3)


A: n(n+2)/2 B: (n-1)(n+2)/2 C: n(n+1)/2 D: (n-1)(n+2)

解析:循环次数(两个for)

因为是求语句3的执行次数,所以求的就是内层循环的次数。n + (n - 1) + (n - 2) + ... + 3 + 2 + 1;

我做这题的时候,就以为题目求的是所有循环循环了多少次。


题目5:

下列程序的输出是( D

#include<stdio.h>
int  main()
{
  int a [12]= {1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;
  for(i=0;i<4;i++)
    p[i]=&a [i*3];
  printf("%d\n",p[3][2]);
  return 0;
}


A: 上述程序有错误 B: 6 C: 8 D: 12 

解析:二维数组、指针、解引用 

我做这道题的时候,做到了最后一步不会转化。当时还疑问:为什么最后是一个二维数组。


题目6:

已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( AC
A: *(X[i]+j) B: *(X+i)[j] C: *(X+i+j) D: *(*(X+i)+j)

 解析:二维数组、指针、解引用

一维数组 arr[i] 等价于 *(arr + i) ;所以 X[i][j] 等价于 *(X + i)[j] ;*(X + 1)[j] 等价于 *(*(X + 1) + j) ;

我做这题的时候没有分清(X)首元素地址和( X[i] )首元素,我错将 X[i] 当成了一个地址,但实际上是一个元素。


题目7:

二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为( A
A: Oxf8b821c4 B: Oxf8b821a6 C: Oxf8b82198 D: Oxf8b821c0

 解析:地址相减、进制转换

我当时看了题之后,完全不知道怎么做,一点头绪都没有。都没有多读几遍题,也没有深入理解这道题) 


 

题目8:

解析:scanf作为循环参数,逻辑转换

我在做这个题的时候想到的方法就是循环,然后使用三目操作符,但是我并没有正确的使用;错误1:因为我在循环中用的是return 三目操作符,所以只判断了一次就返回值了;错误2:题目要求的是输入值,我是直接创建数组对数组初始化,并没有输入值;

正确解答:

代码:

#include <stdio.h>
int main()
{
    int m = 0; // 最小值
    int f = 1;
    int t = 0; // 输入的值
    while(scanf("%d", &t) && (t != -1))
    {
        if(f || t < m) 
        {
            // 第一次进入是通过 f == 1 进入的
            // 之后的进入方法都是通过判断 t < m 进来的
            m = t;
            f = 0;
        }
    }
    printf("%d\n", m);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值