Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
avitec
Заблокирован
#1

Что делает Return в плюсах? - C++

12.04.2017, 14:25. Просмотров 225. Ответов 8
Метки нет (Все метки)

Судя по прочитанной литературе по с++ return что-то возвращает в вызывающую программу, но в одном месте попался странный код и не только потому что в ретурне находится элемент массива, а еще и то, что сам этот массив странный, в нем индекс не сам один а вычисляется через логическое "И" с 16сс числом. Это почему и зачем так? может быть?
C++
1
2
3
4
5
6
7
8
int correct_cc(int ctrl_code)
/*
проверка корректности кода управления:
0 - несуществующий, 1 - нормальный.
*/
{
 return ccs[ctrl_code&=0x000F];
}
Добавлено через 9 минут
Если переменная Ctrl_code равна int 0 (0x0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2017, 14:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что делает Return в плюсах? (C++):

Не понятно что делает __success(return >= 0) - C++
Увидел определение HRESULT typedef __success(return >= 0) long HRESULT; не ясно что это означает? это похоже команда препроцессора...

Что делает return в функции void? - C++
void handle_arrival(vector<Car>& cars, vector< stack<string> >& parking_lot, const string& plate) { // TODO: Handle car arrivals ...

Как сделать так, что если файл существует return true, если нет - return false - C++
Здравствуйте, я новичок в программировании. Мой вопрос очень прост: как сделать так, что если файл существует return true если нет return...

Что означает запись в скобках и что возвращает return - C++
Всем привет! Начал читать книгу BecomeAnXcoder и тут появился вопрос. В пример приведен такой код circleArea(float theRadius) //(1) ...

Что в программе делает так, что процессор грузится на 100%? - C++
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот код программы, на компьютере жрет всю...

Что такое return out? - C++
///

8
DemolitionMan
98 / 154 / 48
Регистрация: 06.04.2016
Сообщений: 992
12.04.2017, 14:25 #2
Ну такая логика у программы, наверное. Нам-то откуда знать. Слово return просто возвращает элемент массива и все.
0
Max Dark
шКодер самоучка
1854 / 1654 / 603
Регистрация: 09.10.2013
Сообщений: 3,679
Записей в блоге: 6
Завершенные тесты: 2
12.04.2017, 14:27 #3
Цитата Сообщение от avitec Посмотреть сообщение
Это почему и зачем так?
Развернем код
C++
1
2
3
4
5
6
int correct_cc(int ctrl_code)
{
    ctrl_code = ctrl_code & 0x000F; // получаем состояние младших 4х бит
    // теперь ctrl_code содержит индекс из проверочной таблицы(0 <= ctrl_code <= 15)
    return ccs[ctrl_code]; // возвращаем значение из таблицы по индексу ctrl_code
}
1
_liv_
234 / 234 / 87
Регистрация: 07.10.2015
Сообщений: 643
Завершенные тесты: 1
12.04.2017, 14:28 #4
avitec, сначала оставляются 4 младшие биты ctrl_code при помощи логического "И" с 0x0f, получится число 0-15.
Затем берется элемент массива ccs с индексом от 0 до 15, индекс равен полученному перед тем числу.
Полученный элемент возвращается из функции.
Если Ctrl_code == 0, то вернется нулевой элемент ccs
1
Байт
Диссидент
Эксперт C
17207 / 11277 / 1787
Регистрация: 24.12.2010
Сообщений: 22,203
12.04.2017, 14:35 #5
Видимо, ccs - какой-то внешний массив. extern или static. Вполне возможно, что в нем только 16 элементов. int ccs[16].
Параметр ctrl_code может быть сборищем флагов. &0x0F выделяет младшие 4 цифры - 4 флага. Наверное, какие-то их комбинации допустимы (ccs[i]==1), какие-то - нет (ccs[i]==0)
Но это только догадки. Без контекста конкретнее сказать трудно.
А сам код вполне разумен.
0
avitec
Заблокирован
12.04.2017, 14:50  [ТС] #6
ccs это массив unsigned char [16] "\x01\x01\x01\x01\x01\x01\0\0\0\0\x01\x01\x01\0\0\0" в дебаггере, наверно в 16сс, в 2сс это было бы наверно это 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0. И нулевой элемент это 1. Но функция эта не имеет никакого смысла, так как массив ссs[16] из маски 0x000F можно использовать только самую младшую цыфру F, так как массив имеет всего 16 индексов. А F это 4 единицы и в логическом И они значение переменной ctrl_code не меняют, зачем тогда весть этот огород, можно было записать просто return[ctrl_code]? и не вызывать эту функцию, а сразу на верхнем уровне получить значение массива?

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

Добавлено через 46 секунд
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Слово return просто возвращает элемент массива и все
А какой?

Добавлено через 2 минуты
Цитата Сообщение от _liv_ Посмотреть сообщение
при помощи логического "И" с 0x0f, получится число 0-15
или я ошибся и берутся 2 декады или как их там 0f и тогда маска все же есть? Только не для этого нулевого значения?

Добавлено через 53 секунды
Цитата Сообщение от Байт Посмотреть сообщение
Вполне возможно, что в нем только 16 элементов. int ccs[16]
да вы были правы, так и есть

Добавлено через 1 минуту
Цитата Сообщение от Байт Посмотреть сообщение
&0x0F выделяет младшие 4 цифры - 4 флага.
значит все таки 4, тогда нет смысла в этой функции
0
Байт
Диссидент
Эксперт C
17207 / 11277 / 1787
Регистрация: 24.12.2010
Сообщений: 22,203
12.04.2017, 14:57 #7
Цитата Сообщение от avitec Посмотреть сообщение
можно было записать просто return[ctrl_code]?
Нет. ctrl_cole может быть больше 15, состоять из большего количества флагов, чем 4. Функция же проверяет совместимость только последних 4-х
Цитата Сообщение от avitec Посмотреть сообщение
можно было записать просто
Можно. Вместо вызова функции писать просто ccs[ctrl_code&=0x000F]
Но это - хороший стиль. Проверка локализована, имеет хорошее мнемоническое название. Кроме того к функции возможно обращение и из других исходных модулей проекта.
0
Max Dark
шКодер самоучка
1854 / 1654 / 603
Регистрация: 09.10.2013
Сообщений: 3,679
Записей в блоге: 6
Завершенные тесты: 2
12.04.2017, 14:57 #8
Цитата Сообщение от avitec Посмотреть сообщение
тогда нет смысла в этой функции
смысл в том, что ctrl_code может быть больше 15.
+ младшие 4 бита ctrl_code являются проверочными, что не было ошибок при передаче полного значения.
0
avitec
Заблокирован
12.04.2017, 14:58  [ТС] #9
Спасибо всем за разъяснение. Понятно примерно.
0
12.04.2017, 14:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2017, 14:58
Привет! Вот еще темы с ответами:

Что значит return(n>=0)?n:-n) - C++
Объясните кто сможет return((n&gt;=0)?n:-n)

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

Что значит слово return? - C++
что значит слово return?

Что это за метод?И что он делает? - C++
double func (double y, int k, int n){ double y1; for (int i=0; i&lt;=n+1;i++) y1=0; double t; t=0; y1=1; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.