第一题
1. 下列程序段的输出结果是()
#include <stdio.h> int main() { int x = 1,a = 0,b = 0; switch(x) { case 0: b++; case 1: a++; case 2: a++; b++; } printf("a=%d,b=%d\n", a, b); return 0; }
A:a=2,b=1
B:a=1,b=1
C:a=1,b=0
D:a=2,b=2
答案及解析 A
switch语句记住一点就是,当满足case的条件,如果case里面没有break,就会继续执行下面的所有语句;
所以x = 1;执行了case1,case2的语句;
第二题
2. 若二维数组a有m列,则在a[ i ] [ j ]前的元素个数为()
A:j * m + i
B:i * m + j
C:i * m + j - 1
D:i * m + j + 1
答案及解析 B
第i行,前面肯定是有0~i - 1行的,因为别忘了是从0下标开始的
所以0 ~ i - 1行一共有 i 行,每行有 m 列,那前 i 行一共就是 i * m 列
那这一行 j 前面下标是 0 ~ j - 1,就是 j 个元素;
所以在a[ i ][ j ]之前的元素一共是i *m + j
第三题
3. 以下数据中,不正确的数值或字符常量是( )
A:c
B:66
C:0xaa
D:50
答案及解析 A
A:错误,单独的c,并不是 'c' ,所以不是表示的字符,这样直接的c,可以理解为16进制,但是前面没有0x,所以也不是16进制的表示方法,既不正确;
B:就是正常的int类型的数据
C:0x开头的是表示16进制的数字,范围就是0~9,a~f
D:正常的int类型
第四题(好题)
4. 以下程序的输出的结果是()
#include <stdio.h> int x = 3; void incre() { static int x = 1; x *= x + 1; printf("%d", x); } int main() { int i; for(i = 1; i < x; i++) { incre(); } return 0; }
A:33
B:22
C:26
D:25
答案及解析 C
本题涉及同名全局变量和静态变量;
局部静态变量只会初始化一次,在局部变量和全局变量名一样的时候,优先使用局部变量;
所以在incre函数内部压根不会用到全局变量的x,在main函数中的x也不会用到incre的x,因为静态变量x的生命周期和作用域都是在incre上,所以即使是静态的,但是出了自己的作用域也不会发挥作用;最后我们只需要分清,在main函数的x是全局变量,在incre函数的x是static的局部变量就OK了;
第一次进入循环就是2;
第二次进入循环,由于静态局部变量只会初始化一次,所以x依旧是2,之后进行计算得6;
打印结果就是26;
第五题
5. 有以下程序,程序运行后的输出结果是()
float fun (int x, int y) { return (x+y); } int main() { int a=2, b=5, c=8; printf("%3.0f\n", fun( (int)fun(a+c, b) , a-c) ); return 0; }
A:编译出错
B: 9
C:21
D:9.0
答案及解析 B
本题涉及的知识点还是蛮杂的,涉及了强制类型转换,格式化打印格式和函数的调用做参数;这里直接讲解重点:
大家肯定是会算出来fun里面的fun(a+c, b)的值为15.000000
所以fun( ( int)fun(a + c, b) , a-c ) = fun( (int)15.000000 , a-c )
强制类型转换为int类型,舍去小数部分为 fun(15, a-c) = 9.000000;
但是在格式化打印这里是规定的 %3.0f
这里小数点后面的数字是表示 保留几位小数,所以这里为0,就是不保留小数,也就是9;
但是小数点前面的数字表示的就是右对齐,数字是几,就右对齐几个空格位置,所以这里其实是先输出3个空格位置,再输出3;
这里我用hhh来区分,看的更明显