C 程序的输出 | 2套
预测以下程序的输出。
问题 1
c
#include
char *getString()
{
char str[] = "Will I be printed?";
return str;
}
int main()
{
printf("%s", getString());
getchar();
}
C
#include
int main()
{
static int i=5;
if(--i){
main();
printf("%d ",i);
}
}
c
#include
int main()
{
static int var = 5;
printf("%d ",var--);
if(var)
main();
}
C
#include
int main()
{
int x;
printf("%d",scanf("%d",&x));
/* Suppose that input value given
for above scanf is 20 */
return 1;
}
C
# include
int main()
{
int i=0;
for(i=0; i<20; i++)
{
switch(i)
{
case 0:
i+=5;
case 1:
i+=2;
case 5:
i+=5;
default:
i+=4;
break;
}
printf("%d ", i);
}
getchar();
return 0;
}
输出:一些垃圾值
上面的程序不起作用,因为数组变量存储在堆栈部分。因此,当 getString 返回值时 str 被删除并且 str 成为悬空指针。
问题2
C
#include
int main()
{
static int i=5;
if(--i){
main();
printf("%d ",i);
}
}
输出
0 0 0 0
说明:由于 i 是一个静态变量并存储在数据段中,因此所有对 main 的调用共享相同的 i。
问题 3
C
#include
int main()
{
static int var = 5;
printf("%d ",var--);
if(var)
main();
}
输出
5 4 3 2 1
解释:与上一个问题相同。这里唯一的区别是,调用 main 和 printf 的顺序改变了,因此输出不同。
问题 4
C
#include
int main()
{
int x;
printf("%d",scanf("%d",&x));
/* Suppose that input value given
for above scanf is 20 */
return 1;
}
输出
1
scanf 返回编号。它已成功读取的输入。
问题 5
C
# include
int main()
{
int i=0;
for(i=0; i<20; i++)
{
switch(i)
{
case 0:
i+=5;
case 1:
i+=2;
case 5:
i+=5;
default:
i+=4;
break;
}
printf("%d ", i);
}
getchar();
return 0;
}
输出
16 21
解释:
最初 i = 0。由于 case 0 为真,i 变为 5,并且由于在 switch 块的最后一条语句之前没有 break 语句,因此 i 变为 16。在开始下一次迭代之前,由于 i++,i 变为 17。现在在下一次迭代中没有任何情况是真的,所以执行进入默认值并且 i 变为 21。
在 C 中,如果一种情况为真,则执行 switch 块,直到找到 break 语句。如果不存在 break 语句,则所有 case 都在 true case 之后执行。如果你想知道为什么 switch 是这样实现的,那么这个实现对于下面的情况很有用。
switch (c)
{
case 'a':
case 'e':
case 'i' :
case 'o':
case 'u':
printf(" Vowel character");
break;
default :
printf("Not a Vowel character");
break;
}