为啥我会收到“浮点异常(核心转储)”?
Posted
技术标签:
【中文标题】为啥我会收到“浮点异常(核心转储)”?【英文标题】:Why am I getting "floating point exception (core dumped)"?为什么我会收到“浮点异常(核心转储)”? 【发布时间】:2019-02-07 03:48:05 【问题描述】:因此,当我输入正数或正数和负数时,代码可以正常工作,但只是输入负数会导致浮点错误,我知道除以零会导致这种情况,但我正在按输入数潜水
#include <stdio.h>
int main()
int integer, pos, neg;
int poscounter, negcounter;
integer = 0;
pos = 0;
neg = 0;
poscounter = 0;
negcounter = 0;
do
printf("Please enter an integer:");
scanf("%d", &integer);
if (integer > 0)
pos += integer;
poscounter++;
else
neg += integer;
negcounter++;
while (integer != 0);
printf("Positive average: = %d", pos / poscounter);
printf("Negative average: = %d", neg / negcounter);
所以输入 -3 -2 -1 0 的输出应该是 "负均值:-2"
【问题讨论】:
如果poscounter
是零,你就除以零。
请注意,negcounter
始终递增。它不是 else 块的一部分。你需要使用else neg += integer; negcounter++;
可能重复What is a debugger and how can it help me diagnose problems?
【参考方案1】:
#include <stdio.h>
int main()
int integer, pos, neg;
int poscounter, negcounter;
integer = 0;
pos = 0;
neg = 0;
poscounter = 0;
negcounter = 0;
do
printf("Please enter an integer:");
scanf("%d", &integer);
if (integer > 0)
pos += integer;
poscounter++;
else if(integer < 0) // Added else if for the logic as it was considering 0 as negative
neg += integer;
negcounter++;
while (integer != 0);
printf("posc = %d\n", poscounter); // Printed for confirmation
printf("negc = %d\n", negcounter); // Printed for confirmation
/* Added these two ifs so that it can check any of the counters is not zero and it will not give (core dumped) */
if(poscounter)
printf("Positive average: = %d\n", pos / poscounter);
if(negcounter)
printf("Negative average: = %d\n", neg / negcounter);
return 0; // Adding this is a good practice
嘿,他们的逻辑有点问题,因为当没有遇到正/负时,它是将表达式除以 0。此外,它将 0 视为负整数。 请通过 cmets 它可能会有所帮助
【讨论】:
为什么添加 if 语句 "if(poscounter)" 工作基本上是说 poscounter 中是否有任何值打印以下内容?? 看,在那里,你的poscounter
被用作股息,所以如果它是零,它会产生错误,你得到的那个。首先 pos/poscounter
被评估,然后 printf()
正在使用它。
如果你觉得这个答案有用,请批准它:)【参考方案2】:
这会在输入 -3,-2,-1,0 时崩溃,因为 if (integer > 0) 始终为 false,因此 poscounter 不会在任何时候递增,因此在 while 循环后 poscounter 将为零。
printf("正平均值: = %d", pos / poscounter);会因为由零操作决定而导致程序崩溃。
最好有一个 if 检查分母,并确保它在 devide 操作中使用之前不为零:
if (0 != poscounter)
printf("Positive average: = %d", pos / poscounter);
这将确保 printf 仅在 poscounter 为非零值的有效情况下执行。
【讨论】:
【参考方案3】:if (integer > 0)
永远不会执行,所以poscounter
永远不会增加,所以最后除法pos / poscounter
不能工作。
【讨论】:
以上是关于为啥我会收到“浮点异常(核心转储)”?的主要内容,如果未能解决你的问题,请参考以下文章