题目1:
若给定条件表达式 (M)?(a++):(a--) ,则其中表达式 M ( C )
A: 和(M==0)等价 B: 和(M==1)等价 C: 和(M!=0)等价 D: 和(M!=1)等价
解析:条件表达式
给了一个表达式,M表示的是:是否为真或是否为假;在C语言中真假判断依据就是:非零为真,零为假;(我做这道题的时候不是知道M表示什么。)
题目2:
如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( A、B、C )
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] 不等效的是【多选】( A、C )
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;
}