[英]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.