📜  C 程序的输出 | 2套

📅  最后修改于: 2022-05-13 01:56:10.973000             🧑  作者: Mango

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;    
  }