Understanding C++ code - "Get the number of digits in an int"
Integer division will truncate the remainder, so continually dividing a number with integer division will inevitably result in zero.
Dividing a number n
by 10 while incrementing a counter i
once for each time the resulting quotient (stored back into n
) is not zero will result in the i
containing the number of digits for the base-10 representation of n
.
x /= 10 continuously divides x by 10, which will make it 0 eventually and cause the while loop to terminate due to 0 being interpreted as false (and any other value than 0 as true).
The reason it starts at length = 1 is because there is always at least 1 digit in the number: if x was from 0 to 9 inclusive, then x /= 10 would cause x to become 0 immediately, meaning nothing inside the loop would execute. Therefore, if length started at 0, it would never get to be incremented to 1 which would be wrong if x was a single digit large.
Manually calculating this example by hand:
234567545 / 10 = 23456754, which is true, so the while loop continues and length becomes 2.
23456754 / 10 = 2345675, true. length becomes 3.
2345675 / 10 = 234567, true. length becomes 4.
234567 / 10 = 23456, true. length becomes 5.
23456 / 10 = 2345, true. length becomes 6.
2345 / 10 = 234, true. length becomes 7.
234 / 10 = 23, true. length becomes 8.
23 / 10 = 2, true. length becomes 9.
2 / 10 = 0, false. The while loop stops with length equal 9.
The loop
while (x /= 10) {
length++;
}
will go until the result of x /= 10
evaluates to false
, since 0
means false
it will go until x /= 10
is 0
. Integer division truncates, ensuring the condition will be reached. This can be illustrated by adding a simple debug statement, i.e.
while (x /= 10) {
length++;
std::cout << length << " " << x << std::endl;
}
Which outputs
2 23456754
3 2345675
4 234567
5 23456
6 2345
7 234
8 23
9 2
There are three things that might be suspicious for you if you are a C++ beginner:
First thing might be operator /=
, which combines an integral division (i.e. without remainder), with an assignment. So x /= 10
actually is the same as x = x / 10
.
Second, each expression in C++ has - after having been evaluated - a value. For an assignment like (x = 0)
, the result is the value of x
after the assignment, i.e. 0
in this case.
Third, a condition like if (x) ...
with x
being of integral type has in C++ the same meaning as if(x != 0)
, i.e. it is false
if x
equals 0
, and it is true
if x
is anything else but 0
.
All together: while ( x /= 10 )
means assign x
the value of an integral division by 10
and then compare the value to 0
. If 0
is reached, the loop ends.
BTW: length
starts with 1
, because any number, even 0
, comprises at least one digit.