Понимание кода C++ - "Получить количество цифр в int"
У меня проблемы с пониманием, как именно работает этот код:
int length = 1;
int x = 234567545;
while (x /= 10)
length++;
Предполагается подсчитать количество цифр в переменной int. Я не понимаю, как в while
цикл работает. Цикл просто обнуляется и останавливается по умолчанию? Кроме того, почему длина начинается с 1?
Ответы
Ответ 1
Если вы новичок C++, вам могут показаться подозрительными три вещи:
Первым может быть оператор /=
, который объединяет целочисленное деление (т.е. без остатка) с присваиванием. Таким образом, x/= 10
самом деле совпадает с x = x/10
.
Во-вторых, каждое выражение в C++ имеет - после оценки - значение. Для назначения, подобного (x = 0)
, результатом является значение x
после назначения, то есть 0
в этом случае.
В-третьих, условие в C++, подобное if (x)...
имеет то же значение, что и if(x != 0)
, то есть оно false
если x
равно 0
, и true
если x
что-то еще, кроме 0
.
Все вместе: while ( x/= 10 )
означает присвоить x
значение интегрального деления на 10
а затем сравнить значение с 0
. Если достигнут 0
, цикл заканчивается.
Кстати: length
начинается с 1
, потому что любое число, даже 0
, содержит хотя бы одну цифру.
Ответ 2
x/= 10 непрерывно делит x на 10, что в конечном итоге сделает его 0 и заставит цикл while завершиться из-за того, что 0 интерпретируется как false (и любое другое значение, кроме 0, как true).
Причина, по которой он начинается с длины = 1, заключается в том, что в числе всегда присутствует хотя бы одна цифра: если x равен от 0 до 9 включительно, то x/= 10 приведет к тому, что x сразу станет 0, что означает, что ничего внутри цикла не будет выполнено., Следовательно, если длина начинается с 0, она никогда не будет увеличена до 1, что было бы неправильно, если бы х был большой цифрой.
Вручную рассчитать этот пример вручную:
-
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.
Ответ 3
Петля
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
Ответ 4
Целочисленное деление будет усекать остаток, поэтому непрерывное деление числа на целочисленное деление неизбежно приведет к нулю.
Разделив число n
на 10, увеличивая счетчик i
один раз для каждого случая, когда результирующий коэффициент (сохраненный обратно в n
) не равен нулю, получится, что i
содержит количество цифр для представления n
из base-10.
Ответ 5
Это помогает понять две части:
- что такое "/="
- когда заканчивается цикл
Объясните "/="
Это:
x /= 10
такой же как:
x = x / 10
Объясните, когда цикл заканчивается
В while
цикл завершается, когда условие ложно. И 0 эквивалентно ложному.
while (condition) {
length++;
}
Таким образом, х равен каждому проходу через цикл, деленному на 10, до тех пор, пока не станет 0. Это завершает цикл.
Итак, условие - это две вещи одновременно:
- это значение, которое сравнивается с 0. Цикл продолжается до тех пор, пока это значение не станет равным 0.
- это присваивание: x получает новое значение при каждой оценке. Он делится на 10, поэтому он сходится к 0.
Ответ 6
Это немного глупости, которую вы часто видите в C/C++, используя тот факт, что TRUE реализовано как ненулевое, а FALSE как ноль *. Таким образом, x многократно делится на 10, и выражение в конечном итоге становится равным нулю, поэтому цикл останавливается.
Хотя это и сбивает с толку, это работает - до того дня, когда кто-то в спешке меняет x с int на double :-) Намного понятнее и менее подвержено сбоям писать "while (x/= 10> = 1)" или даже ставить математика внутри тела цикла, а не в состоянии.
* IMHO, одним из немногих недостатков C является то, что у него не было явного логического типа, как у FORTRAN.