除以整数

时间:2011-01-31 22:57:14

标签: c++ integer

我知道在对整数进行分割时,它的默认方式是丢弃小数部分。例如,

int i, n, calls = 0;
n = 1;
n /= 3;
printf("N = %i\n", n);
for (i = 1; i > 0; i /= 3) {
    calls++;
}
printf("Calls = %i\n", calls);

上面的代码打印:

N = 0
Calls = 1

你能解释一下这种行为吗?

7 个答案:

答案 0 :(得分:14)

1除以3 = .3333(当然重复),数学上。您可以将计算机视为截断.3333,因为它正在进行整数运算(0余数1)。

执行for循环是因为i = 11 > 0。执行循环体后,将i除以3,i变为0,不大于0.

答案 1 :(得分:3)

重写为while,这一点很明显。

i = 1;
while ( i > 0 )
{
    calls++;        
    i /= 3; //This becomes .3333, which truncates to zero
}

答案 2 :(得分:1)

因为它执行一次循环。

for中的循环增量在循环体之后执行,并且在循环条目i > 01 > 0时为真,在下一个循环分割发生时然后测试变为false并循环退出。

答案 3 :(得分:1)

问题出在哪里?第一行输出是立即的:1/3 = 0.33333 ...,删除小数部分为0。

对于第二行,请记住for周期转换为如下所示:

i=1;
while(i>0)
{
    calls++;
    i/=3;
}

所以,在开始时i是1;执行while的第一次迭代是因为i为1,大于0. calls为0并且递增1,因此得到1. i除以3,因此得到0(因为小数部分不是以整数除法计算的)。再次执行while条件检查,但现在i为0,因此不重复循环。 calls保持为1,此值将打印在屏幕上。

答案 4 :(得分:0)

n是一个int,一个除法将返回一个整数而不是double或float

答案 5 :(得分:0)

因为在整数运算中,1除以3的答案是0,余数为1.如果除以两个整数,则得到整数运算。如果需要浮点运算,则至少需要一个操作数为浮点值。

答案 6 :(得分:-2)

这一切都非常简单。

int i, n, calls = 0; // Set calls to 0
n = 1;               // n is now 1
n /= 3;              // n /= 3 = 1/3 = 0
printf("N = %i\n", n);
for (i = 1; i > 0; i /= 3) { // 1/3 = 0
    calls++;                 // runs once
}                            
printf("Calls = %i\n", calls);

希望这有帮助。