我尝试过运行此代码:
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)
,它涉及除以零。但为什么没有出现任何错误?
答案 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)
为假”显然不正确,因为y
和x
是零和因此相等。表达式被短路,第二部分从未被评估(不被零除)。
即使你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)
比给出“异常程序终止”