第一题
1. 下面程序 i 的值为()
int main() { int i = 10; int j = 0; if (j = 0) i++; else i--; return 0; }
A:11
B:9
答案及解析 B
if语句中的条件判断为赋值语句的时候,因为赋值语句的返回值是右操作数;
比如 if(j = 1) 相当于 if(1),if(j = 0) 相当于if(0)
所以在了解这里之后,就可以得出答案啦
第二题(注意细节)
2. 下面程序的输出结果为()
#include <stdio.h> void fun(int *s) { static int j = 0; do { s[j] += s[j + 1]; } while (++j < 2); } int main() { int i, a[10] = {1, 2, 3, 4, 5}; for (i = 1; i < 3; i++) fun(a); for (i = 1; i < 5; i++) printf("%d", a[i]); printf("\n"); return 0; }
A:34756
B:5745
C:5795
D:35745
答案及解析 B
本题考查的是局部static变量和do-while循环的认识;
局部static变量,只会初始化一次,因为是存在静态区的,值不会被刷新;
do-while循环,先执行语句,再判断条件
所以我们这里是进入2次fun函数,最后打印的时候是打印下标为1~4的哦,这里要注意;
在fun函数内部:
第一次进入函数:先初始化一下static变量j = 0;之后进入两次do-while循环;j = 2的时候循环结束,函数也结束;
第二次进入函数:不会执行初始化j,虽然j = 2;但是先执行do-while内部的语句,再判断;
最后数组元素分别为:3 5 7 4 5
输出结果为 5 7 4 5;
第三题
3. 下列代码的结果是
#include<stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1)); return 0; }
A:3,5
B:2,4
C:2,5
D:3,4
答案及解析 B
本题是考查你对指针和数组的认识,我们来一步一步分析:
数组名代表首元素地址,但是有2个例外:sizeof(数组名),&数组名,数组名都表示整个数组
在了解上面的知识之后:
先看&a,这里表示的取整个数组的地址
对指针的加法,移动的字节数是根据这个指针指向的内容的数据类型算的,数据类型是什么,对指针加的数字就乘这个内容的数据类型的字节数;
&a指向的内容是整个数组,数组的数据类型是int [5]
所以&a+1,是移动的整个数组的大小,也就是1 * (5 * 4)字节,移动的也就是整个数组的大小;
但是这个指针被强制转换为int*类型,也就是指向的内容的数据类型为int,加减就不一样了;
则ptr - 1,就是减小一个int类型,4个字节,而不是整个数组的大小了;
第四题
4. 执行下面程序段后, x 的值是( )
int a = 14, b = 15, x; char c = 'A'; x = (a && b) && (c < 'B');
A:true
B:false
C:0
D:1
答案及解析 D
首先我们来看x = (a&&b)&&(c < 'B')
&&是与操作符,是双目操作符,结合性是从左到右;
我们要知道条件判断操作符,真为1,假为0
先算右边的操作数(a&&b)
因为a = 14,b = 15 ;上面就转换为(14 && 15)为真;
所以1 && (c < 'B')
右边c = 'A' ,c < 'B'成立,为真;
最后x = 1 && 1;
所以都为1,为真,x = 1;
第五题
5. while 循环语句的循环体至少执行一次,请问这句话的说法是正确的吗?
A:正确
B:错误
答案及解析 B
只有do-while才会至少执行一次,先执行语句后判断;