Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
DUMP
57 / 31 / 7
Регистрация: 22.02.2015
Сообщений: 261
#1

Bool & - что это - C++

09.07.2016, 19:58. Просмотров 525. Ответов 20
Метки нет (Все метки)

Что делает здесь амперсанд.
C++
1
bool & hello = test[0][0];
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2016, 19:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Bool & - что это (C++):

как правильно понять тип bool ? bool true(const string &str) и что дает это значение ? - C++
задам может глупый вопрос, но прошу ответить. как правильно понять тип bool ? bool true(const string &str) и что дает это...

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

Что это такое **&? - C++
Здравствуйте! как загуглить,

Что это значит if (x&1) ? - C++
основным вопросом есть if (x&1) что это за условия? и что это? x>>1. какая роль в коде? unsigned long long m_recursive (unsigned long...

объясните пожалйста что вот это значит: a[1]=COD[input&0x0f]; b[0]=COD[(input>>4)&0x0f];??? - C++
Доброй ночи);) char COD={0b00000000, 0b00001011, 0b00010110, 0b00011101, 0b00100111, 0b00101100, 0b00110001,...

Если bool name=false, то !name это true? - C++
Добрый день! Привожу код, взятый из книги. Непонятны следующие строки bool found_one = false; строка 104 if( !found_one ) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
09.07.2016, 20:04 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от DUMP Посмотреть сообщение
Что делает здесь амперсанд.
Определение ссылки на объект типа bool.
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,222
Завершенные тесты: 1
09.07.2016, 20:05 #3
получается hello - это ссылка на первый элемент массива test
Programmist5
Заблокирован
13.07.2016, 12:54 #4
Если честно, не работает ваше объяснение. &test не равен &h.
Миниатюры
Bool & - что это  
Operok
149 / 147 / 42
Регистрация: 15.02.2015
Сообщений: 427
Завершенные тесты: 2
13.07.2016, 12:58 #5
Цитата Сообщение от Programmist5 Посмотреть сообщение
Если честно, не работает ваше объяснение. &test не равен &h.
Дело в том, что при взятии адреса переменной типа статического массива она неявно кастится в указатель на первый элемент этого массива, а адрес этой переменной - это адрес указателя на первый элемент массива, который, ясен пень, не равен адресу этого элемента.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
13.07.2016, 12:59 #6
Цитата Сообщение от Programmist5 Посмотреть сообщение
не работает ваше объяснение
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    bool test[5][5];
    bool & h = test[0][0];
    std::cout << test << std::endl;
    std::cout << &(test[0][0]) << std::endl;
    std::cout << &h << std::endl;
}
http://rextester.com/PRXN90843
Ваши результаты в студию
Цитата Сообщение от Programmist5 Посмотреть сообщение
&test не равен &h.
А отладчиком пользоваться где учились?
Programmist5
Заблокирован
13.07.2016, 13:02 #7
Цитата Сообщение от Operok Посмотреть сообщение
Дело в том, что при взятии адреса переменной типа статического массива она неявно кастится в указатель на первый элемент этого массива, а адрес этой переменной - это адрес указателя на первый элемент массива, который, ясен пень, не равен адресу этого элемента.
- если честно, не понял Ваше объяснение. Можно простым понятным человеческим языком.
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,007
13.07.2016, 13:02 #8
Цитата Сообщение от Programmist5 Посмотреть сообщение
&test не равен &h.
Смотря как это объяснение проверять. Ты код-то покажи.
Programmist5
Заблокирован
13.07.2016, 13:03 #9
Ну я же показал скриншот, массив у меня только другой:
C++
1
int test[5][5];
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
13.07.2016, 13:05 #10
Цитата Сообщение от Programmist5 Посмотреть сообщение
Ну я же показал скриншот
Там нет кода.
Цитата Сообщение от Programmist5 Посмотреть сообщение
массив у меня только другой
Эм... а может совсем всё по другому и язык Java?
Сейчас это выглядит так:
- Ребята, у меня машина сломалась.
- Все четыре колеса накачал?
- Какие 4 колеса? У меня мотоцикл на двух.
Programmist5
Заблокирован
13.07.2016, 13:07 #11
Неостроумно.
C++
1
2
int test[5][5];
bool &h = test[0][0];
Вот и весь код. Показал же ведь уже. Среда - C++Builder 6.
Programmist5
Заблокирован
13.07.2016, 13:11 #12
Еще раз.
Миниатюры
Bool & - что это  
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,007
13.07.2016, 13:13 #13
Programmist5, подобного рода код не должен компилироваться. На это есть ряд совершенно четких, прописанных в стандарте языка, ограничений.

Но я объясню что, тем не менее, произошло. Компилятор не может здесь выполнить инициализацию ссылки тем же объектом, который находится в массиве с индексами (0,0). Не может, потому что типы - разные. И размеры у них могут быть в общем случае - разные. Поэтому компилятор здесь сделал временный объект, типа bool, который он получил (неявным) приведением типа int -> bool. Естественно адрес этого объекта будет другим.

Т.е. твой код приблизительно эквивалентен такому:
C++
1
2
3
int test[5][5];
bool tmp = test[0][0];
bool & h = tmp;
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
13.07.2016, 13:18 #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Programmist5 Посмотреть сообщение
Неостроумно.
А показывать никак не связанные друг с другом текст и код - очень остроумно.
Цитата Сообщение от Programmist5 Посмотреть сообщение
Показал же ведь уже.
В каком месте?
Только по кускам и то после того, как тыкнули.


Что касается ссылки.
test[0][0] - имеет тип int
ссылку хотите создать на bool,
компилятор создает некий временный объект типа bool,
со значением true/false в зависимости от значения test[0][0],
затем в h пихается ссылка на этот объект.
Так что test[0][0] и то, на что ссылается Ваша ссылка - разные объекты,
потому и адреса разные.
Был бы массив bool, адреса были бы одинаковые.
Теперь понятна причина "остроумия"?

И, да, как оно скомпилировалось, ссылка же не константная?

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
подобного рода код не должен компилироваться.
а я уж думал, что я что-то путаю )))
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,007
13.07.2016, 13:30 #15
Цитата Сообщение от Croessmah Посмотреть сообщение
а я уж думал, что я что-то путаю )))
Что интересно, если тот код у него компилируется, значит и этот должен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void foo(bool & r)
{
    r = 1;
}
 
int main()
{
    int test[1][1] = { 0 };
    foo(test[0][0]);
    std::cout << test[0][0] << std::endl;
}
Этот код выведет 0, если будет скомпилирован. Тем самым проиллюстрирует проблему, которую описал Страуструп в книжке "Дизайн и эволюция С++" в качестве объяснения запрета на компиляцию такого кода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2016, 13:30
Привет! Вот еще темы с ответами:

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

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

"*&" - что это? - C++
не понимаю для чего нужна &quot;*&amp;&quot; запись. вот пример: int *z; int *&amp;r = z; //объясните пожалуйста что она делает int a = 9; z =...

С && C++ - это плохо? - C++
Большинство программистов говорят о том что С# и C++ мешать в одном коде не хорошо. Но что в этом такого плохого?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.07.2016, 13:30
Ответ Создать тему
Опции темы

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