理解C++代码 - "获取int中的位数"

Vic*_*ree 31 c++ while-loop

我无法理解这段代码的工作原理:

int length = 1;
int x = 234567545;
while (x /= 10)
   length++;
Run Code Online (Sandbox Code Playgroud)

它应该计算int变量中的位数.我不知道while循环是如何工作的.循环是否归零并默认停止?另外,为什么长度从1开始?

Ste*_*ner 55

如果您是C++初学者,有三件事可能会让您怀疑:

第一件事可能是运算符/=,它将整数除法(即没有余数)与赋值相结合.所以x /= 10实际上是一样的x = x / 10.

其次,C++中的每个表达式在经过评估后都有一个值.对于类似的赋值(x = 0),结果是x赋值后的值,即0在这种情况下.

三,如条件if (x) ...x整体式的福利却在C++中的含义相同if(x != 0),即它false是否x平等0,这是true如果x是别的什么,只是0.

所有在一起:while ( x /= 10 )表示分配x积分除以10的值,然后将值与之比较0.如果0到达,则循环结束.

BTW:length首先1,因为任何数字,甚至0包括至少一个数字.

  • 我怀疑第三点的解释误导了一些人,因为它有点歪曲事实,但我个人认为对于这种难度级别的抽象是可以接受的。 (3认同)
  • 在这种情况下,只需添加“for x 类型为`int`”。 (3认同)

bro*_*hir 25

x/= 10连续将x除以10,最终使其为0并导致while循环终止,因为0被解释为false(以及0之外的任何其他值为true).

它在length = 1处开始的原因是因为数字中总是至少有1位数:如果x是从0到9(包括0和9),则x/= 10将导致x立即变为0,这意味着循环内部不执行任何操作.因此,如果长度从0开始,它将永远不会增加到1,如果x是单个数字大,那将是错误的.

手动手动计算此示例:

  1. 234567545/10 = 23456754,这是真的,所以while循环继续,长度变为2.

  2. 23456754/10 = 2345675,是的.长度变为3.

  3. 2345675/10 = 234567,是的.长度变为4.

  4. 234567/10 = 23456,是的.长度变为5.

  5. 23456/10 = 2345,是的.长度变为6.

  6. 2345/10 = 234,是的.长度变为7.

  7. 234/10 = 23,是的.长度变为8.

  8. 23/10 = 2,是的.长度变为9.

  9. 2/10 = 0,假.while循环停止,长度等于9.


Wil*_*ler 8

循环

while (x /= 10) {
  length++;
}
Run Code Online (Sandbox Code Playgroud)

会去,直到结果x /= 10的计算结果为false,因为0意味着false它会去,直到x /= 100.整数除法截断,确保达到条件.这可以通过添加一个简单的调试语句来说明,即

while (x /= 10) {
  length++;
  std::cout << length << " " << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

2 23456754
3 2345675
4 234567
5 23456
6 2345
7 234
8 23
9 2
Run Code Online (Sandbox Code Playgroud)


Gov*_*mar 6

整数除法会截断余数,所以用整数除法连续除法将不可避免地导致零。

分割数n由10而递增计数器i一次每次所得商(存储回为n)不为零将导致i含有的位数为的基10的表示n


Jör*_*yer 5

它有助于理解两个部分:

  • 什么是“/=”
  • 循环何时终止

解释“/=”

这个:

x /= 10
Run Code Online (Sandbox Code Playgroud)

是相同的:

x = x / 10
Run Code Online (Sandbox Code Playgroud)

解释循环何时终止

while循环终止,当条件是假的。并且 0 相当于 false。

while (condition) {
    length++;
}
Run Code Online (Sandbox Code Playgroud)

所以 x 是,每次通过循环,除以 10,直到 is 为 0。这终止了循环。

因此,条件同时是两件事:

  • 它是一个值,与 0 进行比较。循环继续,直到计算结果为 0。
  • 这是一个赋值:x 每次求值都会得到一个新值。它除以 10,因此收敛到 0。