我试过运行这段代码:
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)
,这涉及除以零。但是为什么没有任何错误出现?
我试过运行这段代码:
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;
为 0 y
。所以||
is 快捷方式(这意味着 or 的第二部分没有被评估)。
如果您希望 y 为 0.5,则编写:
double y = 1/2.0;
首先,正如其他人指出的那样,您将 y 分配为零,因为1/2
它是除以 2 个整数。
在您的错误示例中,其中 1 和 2 是整数并且 y 被分配为 0,您的假设“第一个表达式(y <= x)
为假”显然是不正确的,因为y
它们x
都为零,因此相等。表达式被短路,第二部分永远不会被评估(不被零除)。
即使你除以零,也不能保证你会得到一个错误。例如, IEEE 754规定除以零产生无穷大。
首先谢谢你。这个问题非常重要,但我还没有面对。
首先,“y=1/2”行产生“y=0”,其次,“if Condition y/x”中的行是 mean 0/0 “Result is Undefined”。但是在“||” 如果左侧参数为真,则不需要测试其余参数(条件)。所以它跳转到“y++”,结果我们看到结果是 1.00。
但是如果我们写 if(y/x<1 || y<=x)
比它给出“异常程序终止”