这段代码有啥问题?啥是运行时错误?

Posted

技术标签:

【中文标题】这段代码有啥问题?啥是运行时错误?【英文标题】:What's goes wrong with this code? What is runtime error?这段代码有什么问题?什么是运行时错误? 【发布时间】:2021-01-21 09:57:47 【问题描述】:
    当我在 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("%.4lf\n", result);

【问题讨论】:

在您的计算机上的真实环境中运行它以获得更好的错误消息。 很难说。只要您提供正确的输入,我看不出这会导致任何运行时错误。如果你传递的不是 4 个浮点数,那就麻烦了。 %lf 的格式指定给double,给scanf(),给long double,给printf() @WeatherVane 也许在 Microsoft 领域,但不在 C 标准领域。 @IanAbbot 我看不出还有什么问题。并且 float 可以传递到 double 由于类型提升而在可变参数函数中预期的位置 【参考方案1】:

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

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

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

在旧 C 中也不允许在 printf 中使用 %lf(调用 未定义的行为)。请改用 %f(在这种情况下为 %.4f)。 (使用%lfscanf 中读取double 很好)

【讨论】:

你确定是这个原因吗? @user253751 你还有其他候选人的原因吗? @user253751 FAQ 表示系统使用 ANSI C,这是“一些旧的 C 规范”之一。【参考方案2】:

网站上写着“ANSI C”,这是 C89/C90 标准修订版的常用误称...这是过时的弃用版本,任何人都不应在任何地方使用 - 它不接受例如// 评论字符。

问题是隐含的return 0 是在C99 中添加的。在 C89 中,如果 main 不返回值,则行为未定义。如果main 没有明确地return 0,则似乎不接受该解决方案。 URI Online Judge 使用 GCC 4.8.5。 GCC 4.8.5 默认为 gnu89 “方言”,并且没有从 main the exit code is completely random 显式返回。另一方面,将其称为 Ansi C 也不合适,因为它仍然支持 // for cmets 之类的东西。

因此:

#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("%.4lf\n", 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("%.4lf\n", result);
    return 42;

给出“运行时错误”。


C89 不接受的另一件事是 %lf 表示 printfdouble - l 仅对有效 diouxX 转换说明符。值得注意的是,f 未列出!但是任何一个都适用于 URI,因为 glibc 长期以来一直支持 C99。

【讨论】:

以上是关于这段代码有啥问题?啥是运行时错误?的主要内容,如果未能解决你的问题,请参考以下文章

Android(PHP + MySQL)中的这段代码有啥问题?

这段代码有啥错误

Node.js:啥是 ENOSPC 错误以及如何解决?

我正在用 C 语言做一个简单的数据库管理项目。但是当我运行这段代码时,我得到了错误。

这段JS代码为啥会出错?

使用最新的POI3.11时,在运行 XSSFWorkbook workBook = new XSSFWorkbook ();这段代码时出现错误: