Понимание кода 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, что было бы неправильно, если бы х был большой цифрой.

Вручную рассчитать этот пример вручную:

  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.

Ответ 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.