繁体   English   中英

请解释此代码的输出

[英]Please explain this output of the code

#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是怎么来的。

这是我的输出。 这仅供参考。

文字要求:-

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

usr @ usr:〜/ C_programs $ ./返回

输入一个正数:45

45usr @ usr:〜/ C_programs $ ./返回

输入一个正数:89

89usr @ usr:〜/ C_programs $

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

您在GetPositiveInt()函数中缺少return语句。 在没有显式return语句返回值的情况下,请在调用者函数中收集函数调用的返回值,然后使用该返回值会导致未定义的行为

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

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


FWIW,仅在main()情况下, return语句的添加不是强制性的 根据同一文档的第5.1.2.2.3章,关于main()函数

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

在以下功能中:

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

不知道“ 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“功能定义”说:

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

它为我打印0

正如在其他答案中所解释的那样,编译器会通过警告来表示声明为返回某些内容的函数中缺少return语句,但生成的代码会暴露未定义的行为。 这意味着函数可以返回任何值,编译器不能保证任何有关它的值。

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

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

因为您的函数GetPositiveInt()不包含return语句,所以编译器会跳过生成将正确值放入%eax的指令,而该函数将完成其执行,从而将由于早期处理而发生的任何值都放入%eax

这是一种不确定的行为,因为您缺少return语句。但是我可以解释为什么会出现1。

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

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

first printf打印7并返回1作为打印的字符数。 因此输出为71。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM