0

我试过运行这段代码:

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

4 回答 4

5

y实际上是0:

double y = 1/2;

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

double y = 1.0/2.0;
于 2013-02-23T12:46:45.190 回答
3

赋值double y = 1/2;为 0 y。所以||is 快捷方式(这意味着 or 的第二部分没有被评估)。

如果您希望 y 为 0.5,则编写:

double y = 1/2.0;
于 2013-02-23T12:46:10.270 回答
0

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

在您的错误示例中,其中 1 和 2 是整数并且 y 被分配为 0,您的假设“第一个表达式(y <= x)为假”显然是不正确的,因为y它们x都为零,因此相等。表达式被短路,第二部分永远不会被评估(不被零除)。

即使你除以零,也不能保证你会得到一个错误。例如, IEEE 754规定除以零产生无穷大。

于 2013-02-23T13:03:58.470 回答
-1

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

首先,“y=1/2”行产生“y=0”,其次,“if Condition y/x”中的行是 mean 0/0 “Result is Undefined”。但是在“||” 如果左侧参数为真,则不需要测试其余参数(条件)。所以它跳转到“y++”,结果我们看到结果是 1.00。

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

比它给出“异常程序终止”

于 2013-02-23T14:05:48.817 回答