阅读以下程序并告诉我输出结果。
f(int n)
{
static int i=1;
if(n>=5) return n;
n=n+i;
i++;
}
main()
{
f(1);
}
我得到问题的CS Computer Science and IT: Practice Book for PSUs书7
,但在编译时我得到“退出失败”
这可能是什么原因?任何人都可以解释我这个!
从comments到Greg Hewgill的answer代码:
#include <stdio.h>
#include <string.h>
static int i=1;
f(int n)
{
if(n>=5)
return n;
n=n+i;
printf("Before - %d\n",i);
i++;
printf("after - %d\n",i);
}
main()
{
int y;
y=f(1);
printf("Main - %d\n",y);
return 0;
}
答案 0 :(得分:3)
您的main()
函数没有返回任何内容(这意味着它的返回值未定义,并且main()
的返回值被报告为程序的退出代码)。将其更改为:
int main()
{
f(1);
return 0;
}
现在,如果您希望程序可以打印任何内容,那么您必须添加语句来执行此操作。
答案 1 :(得分:2)
使用C99,退出代码为0
。对于较旧的C标准,退出代码未指定。
5.1.2.2.3程序终止
...到达终止main函数的}返回值0。
答案 2 :(得分:1)
f()也没有返回类型,并且并非所有代码路径都会返回值。
答案 3 :(得分:0)
前C99 main
和f
都会隐式返回int
,即使在C99模式下,许多编译器仍会将此作为扩展名。要修复退出失败,请添加:
return 0 ;
main
末尾的应该解决这个问题,在C99中它应该返回0
但在C99之前返回的值是未指定的,因此可以是任何东西。
另一个主要问题是,除非n
为5
,否则如果使用返回值,则会返回f
的末尾而没有返回值,这是返回值函数中的未定义行为值。来自C99标准草案部分6.9.1
功能定义段 12 :
如果到达终止函数的},则使用函数调用的值 调用者,行为未定义。
所以每个路径都需要f
中的显式返回。你的函数的结果归因于undefined behavior,所以任何事情都可能发生。
我们可以通过查看此live example中clang
生成的警告来确认这一切。我们看到的警告如下:
main.cpp:4:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
f(int n)
^
main.cpp:12:1: warning: control may reach end of non-void function [-Wreturn-type]
}
^
main.cpp:14:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^~~~
答案 4 :(得分:0)
听起来你的共享缓存由于不活动而被卸载。测试此方法的一种方法是向现有服务(如果可用)添加角色内缓存,并将缓存使用量交换到此新缓存。此处描述了角色内缓存。
将缓存移出共享产品后,等待必要的1-2分钟以暂停超时,然后重试连接,不应出现延迟。
假设您希望在隔离问题后坚持使用共享缓存选项,我所知道的唯一当前解决方法是运行后台任务,该任务将定期ping缓存以使其保持活动状态。
如果您正在运行完整的Web角色,则可以在应用程序启动时启动后台任务。 如果您通过移动服务进行部署,那么您可以运行&#34; ping&#34;通过预定的工作。您可能遇到的唯一问题是预定作业的最短时间是1分钟,这可能不足以让您的缓存在100%的时间内保持活动状态。http://www.valuze.com/