- 当我在URI Online判断上提交这段代码时,他们会向我显示运行时错误我对运行时错误一无所知。请有人可以解释一下
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
double x1, y1, x2, y2, result;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
result = sqrt(pow(x2 - x1, 2) + pow(y2 - y1 , 2));
printf("%.4lfn", result);
}
网站说"ANSI C";这是C89/C90标准修订版常用的误称。。。这是一个过时的弃用版本,任何人都不应该在任何地方使用它——例如,它不接受//
注释字符。
问题是在C99中添加了隐含的return 0
。在C89中,如果main
没有返回值,则行为未定义。如果main
没有明确地return 0
,则该解决方案似乎不被接受。URI Online Judge使用GCC 4.8.5。GCC 4.8.5默认为gnu89";方言;并且在没有来自CCD_ 6的明确返回的情况下,退出代码是完全随机的。另一方面,将其称为Ansi C也不合适,因为它仍然支持//
之类的注释。
因此:
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
double x1, y1, x2, y2, result;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
result = sqrt(pow(x2 - x1, 2) + pow(y2 - y1 , 2));
printf("%.4lfn", result);
return 0;
}
有效,但
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
double x1, y1, x2, y2, result;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
result = sqrt(pow(x2 - x1, 2) + pow(y2 - y1 , 2));
printf("%.4lfn", result);
return 42;
}
给出";运行时错误";。
C89也不接受的另一件事是%lf
,它表示printf
-l
仅对d
、i
、o
、u
、x
和X
转换说明符有效。值得注意的是,f
未列出!然而,任何一种都可以在URI中工作,因为glibc长期以来一直支持C99。
在一些旧的C规范中,当从函数main
返回而不使用return
语句时,从进程返回的值将是不确定的。(0
将在C99或更高版本中返回(。
还有一些在线判断系统,将进程返回的非零值视为运行时错误。
在printf
语句之后添加return 0;
以避免此错误。
此外,在旧C中,不允许在printf
中使用%lf
(调用未定义的行为(。请改用%f
(在本例中为%.4f
(。(使用%lf
读取scanf
中的double
是好的(