请解释一下代码
#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返回
USR @ USR:〜/ C_programs $ ./return
输入一个正数:45
45usr @ USR:〜/ C_programs $ ./return
输入一个正数:89
89usr @ USR:〜/ C_programs $
以下功能:
int GetPositiveInt(void)
{
int n;
do
{
printf("Enter a positive number : ");
scanf("%d",&n);
}while(n<=0);
}
功能有望return
的int
值,而没有return
声明。您可能想要返回n
的值。
return n;
像这样::这可以通过添加适当的return
语句来实现
int GetPositiveInt(void)
{
int n;
do
{
printf("Enter a positive number : ");
scanf("%d",&n);
}while(n<=0);
return n;
}
恕我直言,最后一点不是必需的。这完全是可选的。 –
主要应该返回0,如果没有指定值我想,但为什么我的代码工作,即使没有返回n;即使没有返回语句,GetPositiveInt()返回'n'的值 –
它不返回,它们是垃圾值。而关于主力,是的,你是对的,虽然这是常见的做法。 –
类=>TL; DR你的代码产生undeifined行为。
您在
GetPositiveInt()
函数中缺少return
声明。如果没有明确的return
语句返回一个值,那么在调用函数中收集函数调用的返回值,并使用它返回undefined behaviour。价:依照
C11
标准文档,章§6.9.1,如果终止的函数
}
达到,和函数调用的值用于由呼叫者,行为未定义。
FWIW,只有在
main()
情况下,除了return
说法是不是强制性。从相同的文档,章节5.1.2.2.3,为main()
功能达到终止的主要功能
}
返回0
不知道“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 “函数定义” 云:
如果}终止一个函数,调用者使用该函数调用的值,该行为是未定义的。
这是不确定的行为的情况下,因为你缺少返回statement.however我可以解释为什么1未来。
printf函数返回由it.For例如印刷
printf("%d",printf("%d",7));
第一个printf打印7中的字符数,并返回作为1打印的字符数量。所以输出是71.
OP从来没有使用'printf(“%d”,printf(“%d”,7));' –
@Cool Guy我从来没有这么说过,我只写过这个解释,printf返回打印的字符数 –
是的,请仔细阅读这个问题。 –
它为我打印0
。
正如在其他答案中所解释的那样,声明返回某个函数的return
语句缺少由编译器用警告发出,但生成的代码暴露了未定义的行为。这意味着该函数可以返回任何值,编译器不能保证任何有关它的信息。
您可以将函数返回的值视为该函数的隐藏局部变量。由于缺少return
语句,因此隐藏变量未初始化,其值是调用该函数时垃圾数据碰巧存储在内存中的值。
在实践中,return
语句被翻译成处理器指令复制返回值到通用处理器的注册表中的一个(通常在x86
%eax
)。调用函数(代码中的main()
)从该寄存器获取值并使用它。
因为你的函数GetPositiveInt()
不包含return
声明,编译器跳过生成放入%eax
正确的值的指令和函数执行完毕在%eax
让任何值正好是那里作为早期处理的结果。
你发布的代码甚至没有编译。在函数'GetPositiveInt()'(第2行)和'while'行之后的'return n;'语句声明后需要分号。 – axiac
对不起,在申报中。但是对于回报n;部分,我最初的问题是,即使没有使用return语句,我也在'num'中得到了'n'的值。此代码的输出打印出的值,n'我为我输入的 –
我看不到图像你的o/p。请以文字形式发布。 –