Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
Заблокирован

Нюансы синтаксиса: statement for - как понимать запись for (count=0, mask=1; count != 16; count++, mask<<= 1)?

11.04.2017, 10:59. Показов 6445. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам

Не по теме:

Много всяких языков попадалось, относительно много конечно, но такое вижу первый раз, что бы тело FOR имело не 3 оператора - начальный, максимальный, и шаг, а еще и маска какая то?

Разве бывает такой FOR? Что он вообще делает? Первый раз такое вижу.
C++
1
for (count=0, mask=1; count != 16; count++, mask<<= 1)
, а вот вся функция:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void out_bin(int data, int num_digits)
/*
Вывод в двоичной форме:
data - выводимое значение
num_digits - число выводимых цифр, начиная справа
*/
{
    char string[16];
    int mask;
    int count;
 
    for (count = 0, mask = 1; count != 16; count++, mask <<= 1)
        string[count] = (data & mask) ? '1' : '0';
    if (fields && num_digits == 16)
    {
        count = num_digits; /* вывод слова с выделением полей */
        textcolor(CYAN);
        for (; count != 11; putch(string[--count]))
            ;
        textcolor(LIGHTRED);
        putch(string[--count]);
        textcolor(YELLOW);
        for (; count != 5; putch(string[--count]))
            ;
        textcolor(GREEN);
        for (; count != 0; putch(string[--count]))
            ;
        textcolor(LIGHTGRAY);
    }
    else /* вывод без выделения полей */
        for (count = num_digits; --count >= 0; putch(string[count]))
            ;
}

Как это работает?

Не по теме:

Точное определение плюсам дал GbaLog - это с++, а не какойтодругойязыккоторыйпохож.

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2017, 10:59
Ответы с готовыми решениями:

Странная ошибка volatile int count - count не является однозначным. Ещё про CloseHandle - для чего это?
Странная ошибка volatile int count - count не является однозначным. Ещё про CloseHandle - для чего это? КОд:#include...

Нюансы синтаксиса: как работают выражения вида statement = statement = statement?
Всем привет. Что значит такое выражение в c++? c = c2 = c/2; и как вообще работают такие выражения?

как count endl заменить на printf ?
Всем добрый вечер , есть одна программа , там встречаются строчки . Собственно вопрос , как будут выглядеть эти строчки с использованием...

36
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
11.04.2017, 11:10
Как это работает?
count увеличивается на 1, затем mask
сдвигается на один двоичный разряд.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.04.2017, 11:26
avitec, инструкция for работает по схеме:
C++
1
2
3
4
for (expression1; expression2; expression3)
{
    one_statement_or_few_statements;
}
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.04.2017, 11:31
  • expression1 - обычно, это инициализация переменной-счётчика (или нескольких переменных-счётчиков одного типа, через запятую). Но это не обязательно. В качестве expression1 может быть любое допустимое выражение.
    .
  • expression2 - условие продолжение цикла. Это выражение вычисляется и результат выражения приводится к типу bool. До тех пор, пока результат выражения true, цикл будет продолжаться.
    .
  • expression3 - обычно, это инкремент или декремент переменной-счётчика (или нескольких переменных-счётчиков одного типа, через запятую). Но это не обязательно. В качестве expression3 может быть любое допустимое выражение.
0
Заблокирован
11.04.2017, 11:31  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
count увеличивается на 1, затем mask
сдвигается на один двоичный разряд.
Это то понятно и так, какая цель использовать сразу две переменные в одном цикле? посмотрите всю функцию под плюсом, пожалуйста.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
11.04.2017, 11:33
Через запятую перечисляются переменные в разделах цикла for: инициализация, условие работы и инкремент переменных. Это нормально.
0
Заблокирован
11.04.2017, 11:37  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
инструкция for работает по схеме:
схема понятна, спасибо, она стандартная, меня интересует конкретное использование сдвига в цикле, я так понимаю что в каждом приращении (инкременте) одновременно сдвигается маска бита. И обратите внимание последующие форы в вункции под плюсом вообще не имеют первого начального выражения
C++
1
2
for (; count != 11; putch(string[--count]));
  textcolor(LIGHTRED);
Добавлено через 1 минуту
Цитата Сообщение от DemolitionMan Посмотреть сообщение
for: инициализация, условие работы и инкремент переменных. Это нормально
я же не об этом, я про маску
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.04.2017, 11:38
Цитата Сообщение от avitec Посмотреть сообщение
обратите внимание последующие форы в вункции под плюсом вообще не имеют первого начального выражения
Это допустимо. Любая часть может быть пропущена. Вы ещё и вот такое можете увидеть:
C++
1
2
3
4
for (;;)
{
    // some code here
}
1
Заблокирован
11.04.2017, 11:41  [ТС]
Давайте я по другому сформулирую вопрос, как работает эта функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void out_bin(int data, int num_digits)
/*
Вывод в двоичной форме:
data - выводимое значение
num_digits - число выводимых цифр, начиная справа
*/
{
 char string[16];
 int mask;
 int count;
 
 for (count=0, mask=1; count != 16; count++, mask<<= 1)
  string[count]=(data&mask)?'1':'0';
 if (fields && num_digits == 16)
 {
  count=num_digits;    /* вывод слова с выделением полей */
  textcolor(CYAN);
  for (; count != 11; putch(string[--count]));
  textcolor(LIGHTRED);
  putch(string[--count]);
  textcolor(YELLOW);
  for (; count != 5; putch(string[--count]));
  textcolor(GREEN);
  for (; count != 0; putch(string[--count]));
  textcolor(LIGHTGRAY);
 }
 else       /* вывод без выделения полей */
  for (count=num_digits; --count >= 0; putch(string[count]));
}
что она делает?

Не по теме:

а то меня скоро закидаю гнилыми помидорами, такое ощущение....



Добавлено через 1 минуту
Цитата Сообщение от gru74ik Посмотреть сообщение
Это допустимо. Любая часть может быть пропущена. Вы ещё и вот такое можете увидеть:
лично Вас я уважаю за мудрость, вы часто мне помогали и многое знаете, я не об этом , а прошу объяснить конкретную функцию что она делает?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
11.04.2017, 11:42
Цитата Сообщение от avitec Посмотреть сообщение
какая цель использовать сразу две переменные в одном цикле?
каждая используется по своему.
count отвечает за заполняемый символ в строке.
mask отвечает за бит, который будет проверяться.
gru74ik,
а почему для expression2 не написано, что это
Цитата Сообщение от gru74ik Посмотреть сообщение
может быть любое допустимое выражение.
?
с оговоркой, конечно, что при пустоте там будет true.
2
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
11.04.2017, 11:46
count в данном цикле отвечает за индекс в массиве string.
mask - это маска для вычленения нужного бита, начиная с младшего.
Цикл работает так, что на каждой итеррации
в массив записывается символ '1' или '0'
в зависимости от того, установлен ли
соответствующий бит в переменной data.
Естевственно, для вычленения
следующего бита маску нужно поменять,
для этого и используется сдвиг
(единичка сдвигается на один разряд).
можно переписать, например, так, если Вам будет проще:
C++
1
2
3
4
for (count = 0, mask = 1; count != 16; count++) {
   string[count] = (data & mask) ? '1' : '0';
   mask <<= 1;     
}
0
Заблокирован
11.04.2017, 11:46  [ТС]
Спасибо, но пока непонятно, выход наверно один, пройти в пошаговом режиме в отладчике и посмотреть что происходит?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
11.04.2017, 11:48
avitec, так Вас интересует вся функция или только цикл?
0
Заблокирован
11.04.2017, 11:50  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
count в данном цикле отвечает за индекс в массиве string.
mask - это маска для вычленения нужного бита, начиная с младшего.
Цикл работает так, что на каждой итеррации
Спасибо, первый доходчивый (для меня) ответ, попробую разобраться... по шагам...

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
так Вас интересует вся функция или только цикл?
да вся,

Не по теме:

это драйвер на плату, который мне нужно переделать для себя... эта функция часть драйвера.... а опыта мало , а форум хороший и люди тут отзывчивые ....

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.04.2017, 11:51
Цитата Сообщение от GbaLog- Посмотреть сообщение
а почему
А потому, что я тоже человек и могу ошибаться и спал я сегодня 3 часа.
2
Заблокирован
11.04.2017, 11:53  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Язык C++ - очень странный предмет. Вроде бы знаешь, а вроде и нет.
это шутка или полусерьезно?
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
11.04.2017, 11:53
Цитата Сообщение от avitec Посмотреть сообщение
я же не об этом, я про маску
- что про маску? Ну да, Вы правы, одновременно инкрементируется и сдвигается влево на 1 бит - это умножение на 2.
0
Заблокирован
11.04.2017, 11:59  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
и спал я сегодня 3 часа
вчера был понедельник.... а не пятница...

Не по теме:

это шутка, возможно неудачная



Добавлено через 2 минуты
Цитата Сообщение от DemolitionMan Посмотреть сообщение
сдвигается вправо на 1 бит - это умножение на 2.
точно вправо, а не влево?

Добавлено через 2 минуты
Всем спасибо огромное, буду разбираться.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
11.04.2017, 12:00
Да-да, влево, исправил уже.
1
11.04.2017, 12:04

Не по теме:

Цитата Сообщение от avitec Посмотреть сообщение
вчера был понедельник.... а не пятница...
Я после рабочего восьмичасового дня на основной работе пишу дома код на заказ (фриланс) ещё 8 часов. И так почти каждый день уже почти полтора месяца.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2017, 12:04

iterator to count
Возможно ли как-то получить порядковый номер вместо итератора не используя локальны счетчик. Для примера: std::string...

Ошибка в count<<x;
Начал работать с С++ и столкнулся с Туевой Хучей проблем, основная из них незнание языка и синтаксиса. Пожалуй первый свой косяк я сюда...

Неоднозначность переменной count
Доброго времени суток. Использую VS2013. Подскажите пожалуйста, по какой причине глобальная переменная, в приведенном ниже коде, не...

Ошибка MySQL error: Column count doesn't match value count at row 1
Подскажите, пожалуйста где тут ошибка? Вылазит ошибка: MySQL error: Column count doesn't match value count at row 1 INSERT INTO...

Ошибка в запросе: Column count doesn't match value count at row 1
Здравствуйте, я новичок в изучении php и sql. При добавлении новой книги в БД необходимо выбрать предмет из выпадающего списка. Когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru