前言
今天是10道选择题
1
题目
下面代码段的输出结果是:
int main() { int a = 3; printf("%d\n", (a += a -= a * a)); return 0; }
答案
-12
知识点
自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。
如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。
C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
计算顺序是从左至右
先计算a * a,
再依次向左计算
a * a == 9
3 - 9 == -6
-6 + -6 == -12
2
题目
若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是
#include <stdio.h> int main() { char c; int v0 = 0, v1 = 0, v2 = 0; do { switch (c = getchar()) { case'a':case'A': case'e':case'E': case'i':case'I': case'o':case'O': case'u':case'U':v1 += 1; default:v0 += 1; v2 += 1; } } while (c != '\n'); printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2); return 0; }
答案
v0=12,v1=4,v2=12
讲解
这道题容易做出v0=8,v1=4,V2=8这样的结果
但我们需要注意的是:case后面没有break的话,会一直执行下去
所以default一共执行了12次
3
题目
如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】
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、B、C
讲解
这就是一道简单的概念题
A:函数实参是int类型,形参用char,发生截断,数据丢失
B:min在for循环中,被初始化为0,与传入的参数已经无关了
C:if条件判断处,将判断相等符号==,写成赋值符号=
D:虽然这个函数不是在所有条件下都有返回值,但这里返回值类型没问题
4
题目
下列 for 循环的次数为
for (int i = 0; i || i++ < 5;);
答案
无限次
知识点
i先使用再增加,
使用:0<5,为真,值是1
增加:i增加为1,
判断条件:1||1,恒为真,死循环
5
题目
在c语言中,一个函数不写返回值类型,默认的返回类型是
答案
int
知识点
我第一次知道这个知识点
6
题目
设函数 fun 和实参数组的说明是如下形式,则对函数的调用语句中,正确的是
void fun(char ch, float x[]); float a[10];
A: fun(“asd” , a[]);
B: fun(‘x’ , A);
C: fun(‘68’ , 2.8);
D: fun(32 , a)
答案
D
知识点
数组传参只传入数组名就可以了,
如C选项这种,传入的是float类型,与数组无关
7
题目
在上下文及头文件均正常的情况下,下列代码的输出是( )(注: print 已经声明过)
int main() { char str[] = "Geneius"; print(str); return 0; } print(char* s) { if (*s) { print(++s); printf("%c", *s); } }
答案
suiene
知识点
这段代码就是使用递归倒序打印字符串
但因为是++s,在回归时s指向的对象已经不是第一个字符了,所以打印不出G
8
题目
在下面的字符数组定义中,哪一个有语法错误( )
A:char a[20]="abcdefg"; B: char a[]="x+y=5."; C: char a[15]; D: char a[10]='5'
答案
D
解法
’5‘是字符常量,不能用于数组的初始化
9
题目
下列定义数组的语句中正确的是【多选】( )
A:#define size 10 char str1[size], str2[size+2]; B:char str[]; C: int num['10']; D:int n=5; int a[n][n+2];
答案
AC
解法
这里对C和D做一下解释
C:
字符’0’,转换成十进制为48,所以C选项最终为
int num[48]
D:
注意:在C99之后支持使用变长数组
但这是特例,在此不做考虑
10
题目
已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】()
A: *(X[i]+j) B: *(X+i)[j] C: *(X+i+j) D: *(*(X+i)+j)
答案
BC
解法
A选项是 正确的,X[i]就是第i行的数组名,数组名表示首元素的地址,X[i]表示第i行的第一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是X[i][j],A正确。
B选项因为[]的优先级高于*,所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],所以错误。
C选项也明显不对,X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,C错误。
D选项是标准的指针形式访问二位数组的一个元素。
结语
这篇文章到这里就结束了,我们下篇文章见~