2014-02-16 92 views
0

我的代码:为什么0%0会导致1?

long long difft, intrv ; 

cout << "difft = " << difft << endl; 
cout << "intrv = " << intrv << endl; 
cout << "difft mod intrv = " << difft%intrv << endl; 

输出:

difft = 0 
intrv = 0 
difft mod intrv = 1 

的0%0的结果是零,但在我的代码,结果是 “1”,为什么呢?

+0

尝试将您的值更改为非零 – Quest

+3

在C++中没有任何解释的一切都是因为未定义的行为:) – Maroun

+2

实际上,0%0是未定义的行为,因为您不能将其除以0。 – Netwave

回答

9

C++的任何模的结果0undefined behavior,从draft C++ standard5.6乘法运算符段落说(重点矿山):

二进制/操作产生了商,而二进制%运算符产生第一个表达除以第二个表达式的余数。 如果/或%的第二个操作数为零,则行为未定义。

此外,使用未初始化的变量也是未定义的行为,所以此程序的行为是不可预知的。

+0

是的,这是“未定义的行为”,因此没有理由产生不同的结果。 –

6

这是未定义的行为,因为模数涉及零除法。

1

你不能被0除!这是一个编译器错误,它让你这样做。这就是为什么你看到1.

+0

这不是编译器的错,因为这个标准并没有强制要求诊断(更不用说病态)。实际上,在一般情况下,编译器_不能阻止这一点。如果除数来自用户输入会怎样?事实上,这里的_does_来自用户输入,因为它是未初始化变量的未指定值。编译器无法预测除数将为0。 –