这段代码有啥问题?啥是运行时错误?
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
)。 (使用%lf
在scanf
中读取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
表示 printf
的 double - l
仅对有效 d
、i
、o
、u
、x
和 X
转换说明符。值得注意的是,f
未列出!但是任何一个都适用于 URI,因为 glibc 长期以来一直支持 C99。
【讨论】:
以上是关于这段代码有啥问题?啥是运行时错误?的主要内容,如果未能解决你的问题,请参考以下文章
Android(PHP + MySQL)中的这段代码有啥问题?
我正在用 C 语言做一个简单的数据库管理项目。但是当我运行这段代码时,我得到了错误。
使用最新的POI3.11时,在运行 XSSFWorkbook workBook = new XSSFWorkbook ();这段代码时出现错误: