#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 $
答案 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。