📜  C 程序的输出 |设置 3

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

C 程序的输出 |设置 3

预测以下程序的输出。
问题 1

c
#include 
int main()
{
  printf("%p", main);
  getchar();
  return 0;
}


c
#include 
int main()
{
   printf("\new_c_question\by");
   printf("\rgeeksforgeeks");
 
   getchar();
   return 0;
}


c
# include
# include
 
void fun(int *a)
{
    a = (int*)malloc(sizeof(int));
}
 
int main()
{
    int *p;
    fun(p);
    *p = 6;
    printf("%d\n",*p);
    
    getchar();
    return(0);
}


c
#include 
int main()
{
    int i;
    i = 1, 2, 3;        
    printf("i = %d\n", i);
 
    getchar();
    return 0;
}


c
#include 
int main()
{
    int i;
    i = (1, 2, 3);        
    printf("i  = %d\n", i);
 
    getchar();
     return 0;
}


c
#include 
int main()
{
    int first = 50, second = 60, third;
    third = first /* Will this comment work? */ + second;
    printf("%d /* And this? */ \n", third);
      
    getchar();
    return 0;
}


输出:函数main 的地址。
说明:函数的名称实际上是一个指针变量的函数和打印函数的地址。符号表是这样实现的。

struct 
{
   char *name;
   int (*funcptr)();
}
symtab[] = {
   "func", func,
   "anotherfunc", anotherfunc,
}; 

问题2

C

#include 
int main()
{
   printf("\new_c_question\by");
   printf("\rgeeksforgeeks");
 
   getchar();
   return 0;
}

输出:geeksforgeeks
解释:首先 printf 打印“ew_c_questioy”。第二个 printf 中有 \r 所以它回到行首并开始打印字符。
现在尝试在不使用任何转义字符的情况下打印以下内容。

new c questions by
geeksforgeeks

问题 3



C

# include
# include
 
void fun(int *a)
{
    a = (int*)malloc(sizeof(int));
}
 
int main()
{
    int *p;
    fun(p);
    *p = 6;
    printf("%d\n",*p);
    
    getchar();
    return(0);
}

这是行不通的。尝试替换“int *p;”与“int * p = NULL;”它将尝试取消引用空指针。
这是因为 fun() 对指针进行了复制,因此在调用 malloc() 时,它将复制的指针设置为内存位置,而不是 p。 p 在调用 fun() 之前和之后指向随机内存,当您取消引用它时,它会崩溃。
如果要从函数向指针添加内存,则需要传递指针的地址(即双指针)。
感谢 John Doe 提供正确的解决方案。为了更好地理解,请访问以下链接:https://stackoverflow.com/questions/1398307/how-can-i-allocate-memory-and-return-it-via-a-pointer-parameter-to-the-打电话
问题 4

C

#include 
int main()
{
    int i;
    i = 1, 2, 3;        
    printf("i = %d\n", i);
 
    getchar();
    return 0;
}

输出:1
上面的程序打印 1. 逗号运算符是从左到右的,但 =运算符的优先级高于逗号运算符。
因此,语句 i = 1, 2, 3 被编译器视为 (i = 1), 2, 3。
现在应该很容易判断下面程序的输出了。

C

#include 
int main()
{
    int i;
    i = (1, 2, 3);        
    printf("i  = %d\n", i);
 
    getchar();
     return 0;
}

问题 5

C

#include 
int main()
{
    int first = 50, second = 60, third;
    third = first /* Will this comment work? */ + second;
    printf("%d /* And this? */ \n", third);
      
    getchar();
    return 0;
}

输出:110 /* 还有这个? */
解释:如果“/*”和“*/”之间不存在双引号(“”),编译器会删除它们。