我知道在对整数进行分割时,它的默认方式是丢弃小数部分。例如,
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
你能解释一下这种行为吗?
答案 0 :(得分:14)
1除以3 = .3333(当然重复),数学上。您可以将计算机视为截断.3333,因为它正在进行整数运算(0
余数1
)。
执行for
循环是因为i = 1
和1 > 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 > 0
为1 > 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);
希望这有帮助。