除零错误?

时间:2013-02-23 12:43:15

标签: c logical-operators

我尝试过运行此代码:

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),它涉及除以零。但为什么没有出现任何错误?

4 个答案:

答案 0 :(得分:5)

y实际上是0:

double y = 1/2;

以上进行整数除法,结果为0.你想要的是:

double y = 1.0/2.0;

答案 1 :(得分:3)

分配double y = 1/2;y产生0。因此||是快捷方式(这意味着或者未评估的第二部分)。

如果你打算成为0.5,那么写下:

double y = 1/2.0;

答案 2 :(得分:0)

首先,正如其他人所指出的那样,你为y指定零,因为1/2是2个整数的除法。

在你的 - 错误 - 例子中,1和2是整数,y被赋值为0,你的假设“第一个表达式(y <= x)为假”显然不正确,因为yx是零和因此相等。表达式被短路,第二部分从未被评估(不被零除)。

即使你divide by zero,也不能保证你会收到错误。例如IEEE 754表示零除以产生无穷无尽。

答案 3 :(得分:-1)

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

首先,行“y = 1/2”产生“y = 0”,其次,“if condition y / x”中的行是平均值0/0“结果是未定义的”。但是在“||”中如果左侧参数为True,则不需要测试其余的Argument(条件)。所以它跳到“y ++”&amp;结果我们看到结果是1.00。

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

比给出“异常程序终止”