Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 除数为零;这是运行时错误还是编译时错误?_C - Fatal编程技术网

C 除数为零;这是运行时错误还是编译时错误?

C 除数为零;这是运行时错误还是编译时错误?,c,C,运行这段代码时,我得到一个浮点异常 为什么文本零除数错误未打印?它应该被打印出来,因为printf(“零除法错误”)是在零除法发生之前执行的 #include<stdio.h> int main() { int p=0;int a=2; printf("zero divison error"); printf("%d",a/p); // why zero divison error is not printed? // i am getti

运行这段代码时,我得到一个浮点异常

为什么文本
零除数错误
未打印?它应该被打印出来,因为
printf(“零除法错误”)
是在零除法发生之前执行的

#include<stdio.h>

int main()
{
    int p=0;int a=2;
    printf("zero divison error");
    printf("%d",a/p);
    // why zero divison error is not printed? 
    // i am getting floating point exception(core dumped).
}
#包括
int main()
{
INTP=0;INTA=2;
printf(“零除数误差”);
printf(“%d”,应付);
//为什么不打印零除法错误?
//我得到浮点异常(内核转储)。
}

在您的实现中,默认情况下,标准输出是行缓冲的<代码>打印F(“零除法错误”)
将字符写入缓冲区,但缓冲区尚未刷新。在那里添加新行
\n
或使用
fflush(stdout)刷新输出。如果在应用程序崩溃之前未刷新输出,则缓冲区的内容将丢失


至于错误:

/
运算符的结果是第一个操作数除以第二个操作数所得的商;
%
运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

标准()中给出了一些可能发生的情况的示例:

2注:可能的未定义行为范围从完全忽略不可预测结果的情况,到在翻译或程序执行过程中以记录的方式表现环境特征(无论是否发出诊断消息),终止翻译或执行(发出诊断消息)

因此,使用诊断消息终止执行(您确实这样做了)只是一种可能性。C编译器也可以拒绝编译程序,或者程序运行时可以将结果设置为0或42;或者完全忽略计算

当我运行程序时,我得到

% ./a.out 
zsh: floating point exception (core dumped)  ./a.out
这对应于以
SIGFPE
终止的程序;虽然它代表的是信号,浮点异常,但该标准表示可以在

一种错误的算术运算,如
零除或一种运算 导致溢出


在调用信号处理程序的那一刻,它不再知道实际操作是什么,因此没有打印其他诊断。

每个人都疯狂地否决投票,甚至没有花时间阅读你的问题,因此我重新发布,希望人们花时间更好地阅读问题和答案

你的问题是为什么句子
zero division error
没有显示,因为你
printf()
在被零除之前就显示了它

答案是:

#include<stdio.h>

int main()
{
    int p=0;int a=2;
    // This will show: the \n will flush the string on stdout
    printf("zero divison error\n");
    // This might not show, the operation can fail before the call to printf()
    printf("%d",a/p);
}
发送到stdout的数据是缓冲的,并且您没有在字符串的末尾提供任何换行符,所以在应用程序崩溃之前,该行保持缓冲状态

使用
fflush(stdout)
在被零除之前刷新
stdout
,或添加一个
\n
,它将正确显示

已审核代码:

#include<stdio.h>

int main()
{
    int p=0;int a=2;
    // This will show: the \n will flush the string on stdout
    printf("zero divison error\n");
    // This might not show, the operation can fail before the call to printf()
    printf("%d",a/p);
}
#包括
int main()
{
INTP=0;INTA=2;

//这将显示:将刷新stdout上的字符串 printf(“零除数错误\n”); //这可能不会显示,操作可能会在调用printf()之前失败 printf(“%d”,应付); }
谁应该“打印”错误?当然这是运行时错误,因为分母可以在运行时获得不同的值。标题与文章中的问题不匹配。你到底在问什么?除零是未定义的行为(对于非IEEE环境中的整数类型或浮点数)-标准没有说它引发异常严格地说,C中没有运行时错误。可以编译的任何东西都可以运行,但如果它调用未定义的行为,任何事情都可能发生请将程序的输出复制/粘贴到您的问题中。换句话说:当运行时错误发生时,你的程序究竟打印什么?@Fabien now itis@Fabien主要问题是标题中的问题:被零除是运行时错误还是编译时错误。答案很好,但我同意OP对缺少打印感到困惑,而不是如何准确地处理被零除的问题。是的,我只是看到标题非常混乱,与问题的内容不匹配。我将删除我的DV。“默认情况下,标准输出是行缓冲的”-->我没有找到C指定的位置。对这种普遍做法有任何引用吗?否决票的原因是像这样的不正确主张会崩溃。当然,关于缓冲的部分是正确的。“\n将刷新stdout上的字符串”-->
“\n”
通常刷新缓冲区,但stdout
未指定为行缓冲。最好使用
fflush(stdout)在他的上下文中,应用程序接收到未处理的信号,因此它将崩溃:-/他甚至声明它崩溃。答案不能太笼统。我删除了那个部分以满足评论员的要求。