Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
75 / 49 / 26
Регистрация: 22.02.2015
Сообщений: 306
1

Bool & - что это

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

Что делает здесь амперсанд.
C++
1
bool & hello = test[0][0];
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2016, 19:58
Ответы с готовыми решениями:

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

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

Обьясните что это значит bool f=false;
#include <iostream> using namespace std; struct Aeroflot { char punkt_naznachenia; ...

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

20
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,171
Записей в блоге: 2
09.07.2016, 20:04 2
Лучший ответ Сообщение было отмечено DUMP как решение

Решение

Цитата Сообщение от DUMP Посмотреть сообщение
Что делает здесь амперсанд.
Определение ссылки на объект типа bool.
1
Модератор
Эксперт С++
9932 / 8448 / 5137
Регистрация: 18.12.2011
Сообщений: 22,639
09.07.2016, 20:05 3
получается hello - это ссылка на первый элемент массива test
2
Заблокирован
13.07.2016, 12:54 4
Если честно, не работает ваше объяснение. &test не равен &h.
0
Миниатюры
Bool & - что это  
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
13.07.2016, 12:58 5
Цитата Сообщение от Programmist5 Посмотреть сообщение
Если честно, не работает ваше объяснение. &test не равен &h.
Дело в том, что при взятии адреса переменной типа статического массива она неявно кастится в указатель на первый элемент этого массива, а адрес этой переменной - это адрес указателя на первый элемент массива, который, ясен пень, не равен адресу этого элемента.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,171
Записей в блоге: 2
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.
А отладчиком пользоваться где учились?
0
Заблокирован
13.07.2016, 13:02 7
Цитата Сообщение от Operok Посмотреть сообщение
Дело в том, что при взятии адреса переменной типа статического массива она неявно кастится в указатель на первый элемент этого массива, а адрес этой переменной - это адрес указателя на первый элемент массива, который, ясен пень, не равен адресу этого элемента.
- если честно, не понял Ваше объяснение. Можно простым понятным человеческим языком.
0
13537 / 7190 / 1723
Регистрация: 30.01.2014
Сообщений: 12,028
13.07.2016, 13:02 8
Цитата Сообщение от Programmist5 Посмотреть сообщение
&test не равен &h.
Смотря как это объяснение проверять. Ты код-то покажи.
0
Заблокирован
13.07.2016, 13:03 9
Ну я же показал скриншот, массив у меня только другой:
C++
1
int test[5][5];
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,171
Записей в блоге: 2
13.07.2016, 13:05 10
Цитата Сообщение от Programmist5 Посмотреть сообщение
Ну я же показал скриншот
Там нет кода.
Цитата Сообщение от Programmist5 Посмотреть сообщение
массив у меня только другой
Эм... а может совсем всё по другому и язык Java?
Сейчас это выглядит так:
- Ребята, у меня машина сломалась.
- Все четыре колеса накачал?
- Какие 4 колеса? У меня мотоцикл на двух.
0
Заблокирован
13.07.2016, 13:07 11
Неостроумно.
C++
1
2
int test[5][5];
bool &h = test[0][0];
Вот и весь код. Показал же ведь уже. Среда - C++Builder 6.
0
Заблокирован
13.07.2016, 13:11 12
Еще раз.
0
Миниатюры
Bool & - что это  
13537 / 7190 / 1723
Регистрация: 30.01.2014
Сообщений: 12,028
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;
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,171
Записей в блоге: 2
13.07.2016, 13:18 14
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от Programmist5 Посмотреть сообщение
Неостроумно.
А показывать никак не связанные друг с другом текст и код - очень остроумно.
Цитата Сообщение от Programmist5 Посмотреть сообщение
Показал же ведь уже.
В каком месте?
Только по кускам и то после того, как тыкнули.


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

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

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
подобного рода код не должен компилироваться.
а я уж думал, что я что-то путаю )))
0
13537 / 7190 / 1723
Регистрация: 30.01.2014
Сообщений: 12,028
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, если будет скомпилирован. Тем самым проиллюстрирует проблему, которую описал Страуструп в книжке "Дизайн и эволюция С++" в качестве объяснения запрета на компиляцию такого кода.
3
Заблокирован
13.07.2016, 16:39 16
Вот этот код у меня уже не компилируется:
C++
1
2
int c[5][5];
bool &h = c[0][0];
- этот код я попробовал в консольном(новом) приложении и он не компилируется, а тот код был в оконном приложении и компилировался. Тот код: инициализация массива в верхних строках, т.е. до функций, создание и присвоение ссылки в обработчике OnClick кнопки 1.
Ну я понял примерно в чем проблема: 2 разных типа совместил int и bool и отсюда все косяки. Так я и думал.

Добавлено через 10 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Что интересно, если тот код у него компилируется, значит и этот должен:
- да, этот код компилируется, но достаточно исправить int на bool в 10-й строке и все работает, как и в начальном примере!
0
Эксперт С++
8230 / 3816 / 828
Регистрация: 15.11.2014
Сообщений: 8,667
13.07.2016, 17:10 17
Цитата Сообщение от DrOffset Посмотреть сообщение
если тот код у него компилируется
нестандартное расширения компилятора от вижуал студии:
позволяет создавать мутабельные ссылки от временных объектов.
но при этом кидает соответствующее предупреждение.

хотя судя по скриншоту - это нефига не Каель.
0
13537 / 7190 / 1723
Регистрация: 30.01.2014
Сообщений: 12,028
13.07.2016, 17:14 18
Цитата Сообщение от hoggy Посмотреть сообщение
нестандартное расширения компилятора от вижуал студии
Было сказано, что он пробует в С++ Builder.
Ну и я знаю про это расширение естественно, только вот в Студии это сделано намеренно и все равно не разрешается для POD, только для пользовательских типов. А тут мы видим что разрешается всегда, а это больше похоже на баг или очень старую реализацию, опирающуюся на первую документацию по языку, в которой это было разрешено.
1
2535 / 1195 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
13.07.2016, 19:16 19
DrOffset, а зачем извращаться с bool& стандарту? Им std::vector<bool> оказалось мало?)
0
13537 / 7190 / 1723
Регистрация: 30.01.2014
Сообщений: 12,028
13.07.2016, 19:29 20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а зачем извращаться с bool& стандарту?
Что?!
Если ты о создании временной переменной, то это общее правило к bool & отношения не имеющее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2016, 19:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Что это значит if (x&1) ?
основным вопросом есть if (x&amp;1) что это за условия? и что это? x&gt;&gt;1. какая роль в коде? unsigned...

Parse_matrix(std::istream& in); std::istream& in что это значит?
Есть функция которую необходимо описать: std::pair&lt;int, int&gt; parse_matrix(std::istream&amp; in){ ...

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

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


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

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

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