繁体   English   中英

除零错误?

[英]division-by-zero error?

我试过运行此代码:

int x = 0;
double y = 1/2;
if (y <= x || y/x < 1)
y++;
printf("%.2f", y);

输出为1.00 ,这让我有些惊讶。 我以为第一个表达式(y <= x)是假的,因为这是|| 运算符C还必须计算第二个表达式(y/x < 1) ,该表达式涉及除以零。 但是为什么没有出现任何错误?

y实际上是0:

double y = 1/2;

上面是整数除法,所以结果是0。您想要的是:

double y = 1.0/2.0;

赋值double y = 1/2; 产生y 0。 因此|| 是快捷方式(表示的第二部分不被评估)。

如果您打算y为0.5,请输入:

double y = 1/2.0;

首先,正如其他人指出的那样,您将y分配为零,因为1/2是2的整数除。

在您的-错误的示例中,其中1和2是整数,并且y被赋值为0,您的假设“第一个表达式(y <= x)为false”显然是错误的,因为yx均为零,因此相等。 该表达式是短路的,并且从不评估第二部分(不除以零)。

即使您除以零,也无法保证会得到错误。 例如, IEEE 754指出,除数为零会产生不定数。

首先,谢谢。 该问题非常重要,但我还没有面对。

首先,“ y = 1/2”行产生“ y = 0”,其次,“如果条件y / x”的均值为0/0,则“结果不确定”。 但是在“ ||”中 如果Left Argument为True,则不需要测试其余Argument(condition)。 因此它跳转到“ y ++”,结果是1.00。

但是如果我们写if(y / x <1 || y <= x)

比给出“异常程序终止”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM