一:
题目:
来源:中国大学MOOC“程序设计入门——C语言”第十六开课期末考试第27题
以下代码段的输出是:
char a[20]="cehiknqtw";
char *s="fbla", *p;
int i, j;
for(p=s; *p; p++)
{
j=0;
while (*p>=a[j] && a[j]!='\0')
j++;
for(i=strlen(a); i>=j; i--)
a[i+1] = a[i];
a[j]=*p;
}
printf("%s", a);
解答:
abcefhiklnqtw
代码本质:将字符串s中的每个字符,从右往左,依次插入字符数组a中,插入规则按照字母表顺序
二:
题目:
来源:中国大学MOOC“C语言程序设计进阶”第十五次开课小测验1.2第一题 对于以下代码段,正确的说法是:
char *p;
while (1) {
p = malloc(1);
*p = 0;
}
-
A. 最终程序会因为没有没有空间了而退出
-
B. 最终程序会因为向0地址写入而退出
-
C. 程序会一直运行下去
-
D. 程序不能被编译
解答:
- D. 这段代码是合法的,所以可以编译。
- C. 肯定是无法永远运行下去啦。
- A. 这确实是引起程序终止的原因,但不是直接原因。
- B. 程序一直分配内存,肯定会引起内存耗尽。而malloc在分配内存失败时并不会终止程序,而是返回NULL指针。而第5行代码试图向NULL指针位置写入数据,这会引起程序终止(通常操作系统会因为“段错误”而终止程序)。
所以 B 才是引起程序退出的直接原因。
三:
题目:
以下代码段的输出是:
int x, y, z, w;
void p(int *y, int x) {
static int w;
*y++;
x++;
w = x+*--y;
printf("%d#%d#%d#%d#",x,*y,z,w);
}
int main(void)
{
int x, y, z, w;
x=y=z=w=1;
do
{
static int x;
p(&x, y);
printf("%d#%d#%d#%d#",x,y,z,w);
} while(0);
return 0;
}
正确答案:2#0#0#2#0#1#1#1#
解析:
- 静态变量和全局变量初始化为0
- 变量优先级:全局变量<本地变量<代码块变量
- *y++:取y指向的值,然后y指针后移。不改变y指向的值
- *--y:y指针前移,然后取值