请解释一下这段代码的输出

时间:2015-05-04 11:33:39

标签: c function return printf scanf

#include<stdio.h>
int GetPositiveInt(void);

int main(void)
{
    int num = GetPositiveInt();
    printf("%d",num);
    return 0;
}

int GetPositiveInt(void)
{
    int n;
    do
    {
        printf("Enter a positive number : ");
        scanf("%d",&n);
    }while(n<=0);

}

输出是n的值,但我不知道它是如何返回num的。 scanf()printf()会影响函数的return值吗?

如果我添加printf("%d",7)之类的声明;在while之后,输出为71,不知道1是如何出现的。

This is我的输出。这仅供参考。

要求的文字: -

  

usr @ usr:〜/ C_programs $ gcc -std = c99 return.c -o return

     

usr @ usr:〜/ C_programs $ ./return

     

输入正数:45

     

45usr @ usr:〜/ C_programs $ ./return

     

输入正数:89

     

89usr @ USR:〜/ C_programs $

5 个答案:

答案 0 :(得分:4)

  

TL; DR 您的代码会产生未定义的行为。

您在return函数中缺少GetPositiveInt()语句。如果没有明确的return语句来返回值,则在调用函数中收集函数调用的返回值并使用该函数调用undefined behaviour

参考:根据C11标准文件,章节§6.9.1,

  

如果到达了终止函数的},并且调用者使用了函数调用的值,则行为未定义。

FWIW,仅在main()的情况下,return语句的添加 不是必需的 。来自同一文件,第5.1.2.2.3章,main()函数

  

到达终止main函数的}返回值0。

答案 1 :(得分:3)

在以下功能中:

int GetPositiveInt(void)
{
  int n;
  do
  {
    printf("Enter a positive number : ");
    scanf("%d",&n);
  }while(n<=0);

}

该函数应该return int值,而没有return语句。您可能想要返回n的值。这可以通过添加合适的return语句来实现:

 return n;

像这样:

int GetPositiveInt(void)
{
  int n;
  do
  {
    printf("Enter a positive number : ");
    scanf("%d",&n);
  }while(n<=0);

  return n;
}

答案 2 :(得分:2)

  

不知道'1'是怎么来的。

因为您没有在方法GetPositiveInt中返回任何内容 - 并且行为未定义:

int GetPositiveInt(void)
{
    int n;
    do
    {
        printf("Enter a positive number : ");
        scanf("%d",&n);
    }while(n<=0);

    return n; //<---Add this line

}

C99 6.9.1 / 12“函数定义”说:

  

如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。

答案 3 :(得分:1)

它为我打印0

正如其他答案中所解释的那样,声明返回某些内容的函数中缺少return语句会被编译器发出警告信号,但生成的代码会暴露未定义的行为。这意味着函数可以返回任何值,编译器无法保证它的任何内容。

您可以将函数返回的值视为该函数的隐藏局部变量。由于缺少return语句,隐藏变量未初始化,其值是在调用函数时发生在内存中的任何垃圾数据。

实际上,return语句被转换为处理器指令,该指令将返回的值复制到通用处理器的注册表之一(通常%eax上的x86)。调用函数(代码中的main())从该寄存器中获取值并使用它。

因为函数GetPositiveInt()不包含return语句,所以编译器跳过生成将正确值放在%eax中的指令,并且函数完成执行,允许{{1}因为早期处理而发生的任何价值。

答案 4 :(得分:0)

这是一个未定义行为的情况,因为你缺少return语句。但是我可以解释为什么会出现1。

printf函数返回由它打印的字符数。例如

 printf("%d",printf("%d",7));

首先printf打印7并返回1作为打印的字符数。所以输出是71。