Понимание условия выхода цикла for - PullRequest
6 голосов
/ 09 февраля 2012

У меня возник этот вопрос после прочтения этой темы. Вывести int в двоичном представлении с использованием C

.в битовую позицию, чтобы преобразовать из десятичного числа int в двоичный символ *.

for(; bits--; u >>= 1)
    str[bits] = u & 1 ? '1' : '0';

Я понимаю, почему не требуется инициализированное значение.Это синтаксис для цикла for, который я всегда знал:

for ( variable initialization; condition; variable update )

Что я не понимаю, так это то, как 'bit--' может быть условием выхода.Пожалуйста, помогите мне понять, как работает этот код (я проверял его, и он действителен).

Спасибо.

Ответы [ 4 ]

9 голосов
/ 09 февраля 2012

В C значение ноль оценивается как «ложь» в логическом контексте.Поэтому, когда bits-- оценивается как 0, в контексте цикла оно оценивается как "ложное" и завершает цикл.

Если вы скажете, например:

int x = 1;
if (--x)
{
  printf("True!\n");
}
else
{
  printf("False!\n");
}

Он выведет «False», потому что --x оценивается как 0, что в ложном контексте равно «false».

1 голос
/ 09 февраля 2012

Все условия в основном сводятся к проверке, является ли что-то 0 или нет.0 означает false, все остальное означает true.Так что этот цикл прервется, когда bits будет равно 0.

Иногда вы увидите while или if написанные условия

if (variable) // or while(variable)

Это просто сокращение для

if (variable != 0) // or while (variable != 0)

То есть

for (; bits--; u >>= 1) 

- это сокращение от

for (; bits-- != 0; u >>= 1)
0 голосов
/ 09 февраля 2012

Как уже говорилось, в C вы можете использовать целые числа в качестве условия - 0 или false, что-нибудь еще для true. (На самом деле, вы почти всегда делаете это - даже выражение типа a<b является целым)

Итак, цикл закончится, когда bits-- будет равно 0.

Когда оператор -- следует за переменной, он уменьшает переменную и получает ее предыдущее значение. например, если у вас есть int a=3,b; b=a--;, то b будет 3, а a будет 2.

Итак, цикл завершится после того, как эти биты будут уменьшены с 0 до -1. Это означает, что если в начале, bits==8 (например), цикл будет повторяться 8 раз, когда в первом, биты будут 7 (потому что условие проверено), а в последнем, биты будут 0 Хороший способ перебрать массив (так как в c, массив bits переменных был проиндексирован от 0 до bits-1).

0 голосов
/ 09 февраля 2012

битов - это выражение присваивания типа int (так как оно вернет значение b, которое является int). Чтобы соответствовать синтаксису цикла for, он преобразуется в логическое выражение, что означает, что оно истинно, если биты! = 0. На самом деле условие идентично битам! = 0, но при использовании битов - оно изменяет значение битов одновременно, делая код более компактным, вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...