请解释代码的输出 #包括 int GetPositiveInt(无效); 内部主(空) { int num=GetPositiveInt(); printf(“%d”,num); 返回0; } int GetPositiveInt(无效) { int n; 做 { printf(“输入正数:”); scanf(“%d”和“&n”); }而

请解释代码的输出 #包括 int GetPositiveInt(无效); 内部主(空) { int num=GetPositiveInt(); printf(“%d”,num); 返回0; } int GetPositiveInt(无效) { int n; 做 { printf(“输入正数:”); scanf(“%d”和“&n”); }而,c,function,return,printf,scanf,C,Function,Return,Printf,Scanf,TL;DR您的代码生成未定义的行为 在GetPositiveInt()函数中缺少return语句。如果没有显式的return语句来返回值,则在调用方函数中收集函数调用的返回值并使用该语句将导致错误 参考:根据C11标准文件第§6.9.1章 如果到达了终止函数的},并且调用方使用了函数调用的值,则行为未定义 FWIW,仅在main()的情况下,添加return语句是非强制性的。来自同一文档的第5.1.2.2.3章,用于main()函数 到达终止主函数的},返回值0 不知道“1”是怎么来的 因为您

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

GetPositiveInt()
函数中缺少
return
语句。如果没有显式的
return
语句来返回值,则在调用方函数中收集函数调用的返回值并使用该语句将导致错误

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

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


FWIW,仅在
main()
的情况下,添加
return
语句是非强制性的。来自同一文档的第5.1.2.2.3章,用于
main()
函数

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

不知道“1”是怎么来的

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

#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);

}
int-GetPositiveInt(无效)
{
int n;
做
{
printf(“输入正数:”);
scanf(“%d”和“&n”);

}而(n在以下函数中:

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

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

}
像这样:

 return n;
int-GetPositiveInt(无效)
{
int n;
做
{
printf(“输入正数:”);
scanf(“%d”和“&n”);

}while(n这是一个未定义行为的例子,因为您缺少return语句。但是我可以解释为什么会出现1

printf函数返回它打印的字符数

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

  return n;
}

第一个printf打印7,并返回1作为打印字符数。因此输出为71。

它为我打印
0

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

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

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


因为您的函数
GetPositiveInt()
不包含
return
语句,编译器将跳过生成将正确值放入
%eax
的指令,函数将完成其执行,让
%eax
任何由于早期处理而出现的值进入。

您发布的代码甚至没有编译。它需要函数
GetPositiveInt()
声明后的分号(第2行)和
while
行后面的
return n;
语句。很抱歉,声明中的;。但是对于return n;部分,我的第一个问题是,即使不使用return语句,我也会在'num'中获得'n'值。此代码的输出会打印我为meI输入的值,因为meI看不到您的o/p图像。请以文本形式显示。输出仅供偶然发现该问题的其他人参考。自动更正将其更改为“请解释此问题”。我认为,如果未指定值,earliermain应返回0,但为什么我的代码即使不返回n;GetPositiveInt()返回值为'n',即使没有meIt的return语句也不会返回,这些都是垃圾值。关于main,是的,您是对的,尽管这是一种常见的做法。@abhishekjaiswal,其他回答说您的代码表现出未定义的行为。未定义的行为意味着任何事情都可能发生。您的代码可能会给出预期的or意外结果。您应该尽可能避免UB。行为未定义:在ideone中,输出为1,在我的编译器上,输出为0。未定义,输出可以是任何OP从未使用过的内容
printf(“%d”,printf(“%d”,7))
@酷家伙我从来没有说过,我写这句话只是为了解释printf返回打印的字符数
int GetPositiveInt(void)
{
  int n;
  do
  {
    printf("Enter a positive number : ");
    scanf("%d",&n);
  }while(n<=0);

  return n;
}
 printf("%d",printf("%d",7));