c语言 - 这段代码出了什么问题?什么是运行时错误?


  1. 当我在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仅对diouxX转换说明符有效。值得注意的是,f未列出!然而,任何一种都可以在URI中工作,因为glibc长期以来一直支持C99。

在一些旧的C规范中,当从函数main返回而不使用return语句时,从进程返回的值将是不确定的。(0将在C99或更高版本中返回(。

还有一些在线判断系统,将进程返回的非零值视为运行时错误。

printf语句之后添加return 0;以避免此错误。

此外,在旧C中,不允许在printf中使用%lf(调用未定义的行为(。请改用%f(在本例中为%.4f(。(使用%lf读取scanf中的double是好的(

相关内容

最新更新