我很难理解这段代码的确切作用:
int length = 1;
int x = 234567545;
while (x /= 10)
length++;
它应该计算int变量中数字的数量。我不明白while
循环是如何工作的。这个循环只是默认地到零并停止吗?另外,为什么长度从1开始?
我很难理解这段代码的确切作用:
int length = 1;
int x = 234567545;
while (x /= 10)
length++;
它应该计算int变量中数字的数量。我不明白while
循环是如何工作的。这个循环只是默认地到零并停止吗?另外,为什么长度从1开始?
如果你是C++初学者,以下三个方面可能会让你感到困惑:
首先是运算符/=
,它将整数除法(即没有余数)与赋值结合在一起。所以x /= 10
实际上等同于x = x / 10
。
其次,在C++中,每个表达式在被评估后都有一个值。对于像(x = 0)
这样的赋值语句,结果是赋值后x
的值,即在本例中为0
。
第三个方面是,当x
是整型时,类似if (x) ...
的条件在C++中与if(x != 0)
有着相同的意义,即如果x
等于0
,则为false
;否则,为任何不为0
的值,则为true
。
综上所述:while ( x /= 10 )
表示先将x
除以10
并将商赋值给x
,然后与0
进行比较。当达到0
时,循环结束。
顺便说一下:length
从1
开始,因为任何数字,甚至是0
,都至少包含一个数字。
int
的x”即可。 - user202729x /= 10会不断地将x除以10,最终使它变成0,这样while循环就会因为0被解释为假(任何非0值均为真)而终止。
它从长度1开始的原因是因为数字中至少有1个数字: 如果x是从0到9(包括0和9)的数字,则x /= 10会立即将x变为0,意味着循环内部不会执行任何操作。因此,如果长度从0开始,它永远不会增加到1,这对于x只有一位数字的情况是错误的。
手动计算该示例:
234567545 / 10 = 23456754,为真,所以while循环继续执行,并且长度变为2。
23456754 / 10 = 2345675,为真,长度变为3。
2345675 / 10 = 234567,为真,长度变为4。
234567 / 10 = 23456,为真,长度变为5。
23456 / 10 = 2345,为真,长度变为6。
2345 / 10 = 234,为真,长度变为7。
234 / 10 = 23,为真,长度变为8。
23 / 10 = 2,为真,长度变为9。
2 / 10 = 0,为假。while循环停止,长度等于9。
while (x /= 10) {
length++;
}
程序将一直执行,直到执行x /= 10
后的结果为false
,因为0
代表false
,所以它将一直执行,直到x /= 10
的结果是 0
为止。整数除法会截断小数部分,确保达到终止条件。可以通过添加一个简单的调试语句来说明这一点,例如:
while (x /= 10) {
length++;
std::cout << length << " " << x << std::endl;
}
需要输出哪些内容?
2 23456754
3 2345675
4 234567
5 23456
6 2345
7 234
8 23
9 2
整数除法将截断余数,因此不断使用整数除法将不可避免地导致结果为零。
将数字n
除以10,同时每当所得商(存回n
)不为零时增加计数器i
一次,将导致i
包含n
的十进制表示中数字的数量。
理解两个部分很有帮助:
这个符号:
x /= 10
与以下代码等效:
x = x / 10
while
循环当条件为 false 时终止。而且 0 等同于 false。
while (condition) {
length++;
}
每次循环中,x 都会除以 10,直到它变为 0。这终止了循环。
所以,条件同时满足两个方面:
这是在C/C++中经常看到的一些愚蠢的行为,利用了TRUE被实现为非零,FALSE被实现为零的事实。所以x被重复除以10,表达式最终变成零,循环停止。
虽然令人困惑,但这种方法是可行的 - 直到有一天有人匆忙地将x从int更改为double :-) 写"while (x /= 10 >= 1)"或甚至将数学放入循环体内而不是条件内,会更清晰并且更少出错。
*我认为C的少数缺点之一是它没有明确的逻辑类型,而FORTRAN则有。
>=
的优先级比 /=
高 (https://en.cppreference.com/w/cpp/language/operator_precedence)。 因此,10 >= 1
被评估为 1
,而 x /= 1
不会改变 x
的值,导致一个无限循环。 - kfx
ceil(log10(x))
。 - user149341