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

Приведение более широких целочисленных к bool может не считаться сужением/усечением?

25.08.2017, 10:33. Показов 3325. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
clang
Разное поведение при выставленных флагах:
clang++.exe -O2 -Wextra-tokens -pedantic-errors -pedantic -Werror -Weverything -Wall -pthread -std=c++1z

ОК:
C++
1
2
3
4
5
6
int main(){
   bool x = true;
   int y = 10;
 
   x = y;
}
NO:
C++
1
2
3
4
5
6
int main(){
   short x = 1;
   int y = 10;
 
   x = y;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2017, 10:33
Ответы с готовыми решениями:

Недопустимое приведение bool к bool
Непонятная мне ошибка при проверке занятости контрола WebBrowser. На скрине WebB - экземпляр браузера. Код выполняется в BackgroundWorker,...

Bool и Bool? приведение типов
Доброго дня. На строку Properties.Settings.Default.IsCheckedtargettime = checkBoxAutoRestart.IsChecked; Комилятор ругается...

Приведение целочисленных типов переменных
Только начал осваивать Java, и интересует вопрос. В общем есть числовые целочисленные типы переменных: byte (диапазон значений от ...

49
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
25.08.2017, 10:47
del
0
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
25.08.2017, 11:40
Boolean conversions [conv.bool]
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. For direct-initialization, a prvalue of type std​::​nullptr_*t can be converted to a prvalue of type bool; the resulting value is false.
0.50
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 12:37  [ТС]
Этот ответ не отвечает на заданный вопрос.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 14:11
daslex,
Думаю такое приведение не должно считаться "сужающим", вот почему:
Под сужением как правило подразумевается потеря данных которое может иметь существенное значение с точки зрения данных. Например если short-у присвоить значение int, т.к int может содержать большее число чем short, это может привести к потери данных. Поэтому компиляторы в этом случае выдают соответствующее предупреждение(в случае с флагом -Werror, ошибку компиляции).

Теперь разберёмся, что такое bool:
Две константы, true == 1, false == 0. Все что не 0, является true.
Когда вы присваиваете bool-у int значение которого не равно нулю, оно интерпретируется как true(1).
И в конечном счёте пофиг что там может быть потенциальная потеря данных в результате преобразования. Эти данные не имеют для нас никакого значения в контексте приведения к bool. Нас интересует результат(либо true, либо false). Думаю хотя бы по этой причине такой код должен компилироваться без ошибок.

Вот выдал вам компилятор предупреждение о сужении при приведении к bool, что дальше? Что будете делать с этой информацией на практике? Главное узнать результатом будет true или false, остальное нас не интересует.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 14:22  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
т.к int может содержать большее число чем short, это может привести к потери данных.
А bool по-Вашему int не убьёт?
int не может содержать больше чем bool?

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
Думаю хотя бы по этой причине такой код должен компилироваться без ошибок.
Разные компиляторы - разное поведение.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.08.2017, 14:29
Цитата Сообщение от Undisputed Посмотреть сообщение
Думаю такое приведение не должно считаться "сужающим"
Тут не думать надо, а в стандарт смотреть, где написано что есть сужающее преобразование (narrowing conversion).

Преобразование в bool не является сужющим, но не потому, что "...", а по определению.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 14:32
daslex,
int как жил в памяти так и останется жить.
Приведение одного типа к другому сохраняет исходное значение...

У вас два примера. Второй должен приводить к ошибкам(warning без флага -Werror, или ошибку компиляции если этот флаг установлен).

Если вы считаете что первый пример должен приводить к ошибкам, то покажите плиз это на rextester.com.
Я скомпилил с вашими флагами на clang, ошибок не было.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 14:49  [ТС]
— from an integer type or unscoped enumeration type to an integer type that cannot represent all the values of the original type, except where the source is a constant expression and the actual value after conversion will fit into the target type and will produce the original value when converted back to the original type.
bool - целый тип. Он не может вместить int, сужение. Это в стандарте, если я не ошибаюсь, имеют в виду.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.08.2017, 15:13
Цитата Сообщение от daslex Посмотреть сообщение
bool - целый тип.
bool - integral type
3.9.1.7
Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively
called integral types
Кончайте уже фантазировать.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 15:58  [ТС]
bool integer types == целочисленный тип, что не так?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.08.2017, 16:12
Цитата Сообщение от daslex Посмотреть сообщение
bool integer types == целочисленный тип, что не так?
вы разницу между словами "integral" и "integer" не видите? Это разные понятия. Ссылку на стандарт я привел. Там же ранее написано (пп 1 и 2) что такое integer types.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 16:18  [ТС]
Я вижу у Вас integral и в стандарте integer. Слова я различаю.

Добавлено через 2 минуты
Синонимом для термина «целочисленный тип» служит термин «целый тип» (integer type).
bool - целый тип.

Не могу понять Вас совсем, avgoor.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.08.2017, 16:58
Цитата Сообщение от daslex Посмотреть сообщение
Синонимом для термина «целочисленный тип» служит термин «целый тип» (integer type).
bool - целый тип.
Не могу понять Вас совсем, avgoor.
он имеет ввиду, что bool - интегральный (integral), а не целочисленный (integer)

3.9.1 Fundamental types [basic.fundamental]
There are five standard signed integer types : “signed char”, “short int”, “int”, “long int”, and “long long int”
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 17:06  [ТС]
Я понимаю, что он пишет, я не понимаю, что он имеет в виду. Потому что даже в цитате, которую он даёт, написано не integral, а integer.

С чего вдруг слово integer, написанное в стандарте, становится словом integral в русском сегменте?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.08.2017, 17:13
Цитата Сообщение от daslex Посмотреть сообщение
Потому что даже в цитате, которую он даёт, написано не integral, а integer.
в цитате фигурируют оба слова.

Цитата Сообщение от daslex Посмотреть сообщение
С чего вдруг слово integer, написанное в стандарте, становится словом integral в русском сегменте?
Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively
called integral types
типы: bool, char, char16_t, char32_t, wchar_t,
а так же знаковые и без знаковые целочисленные - называются встроенными типами
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 17:31  [ТС]
Ясно. Спасибо.

Но его ответ не отвечает на мой вопрос и в фантазиях меня зря обвиняет.
OK:
C++
1
2
3
4
5
6
int main(){
   bool x = true;
   int y = 10;
 
   x = y;
}
NO:
C++
1
2
3
4
5
6
int main(){
   char x = true;
   int y = 10;
 
   x = y;
}
Выбраны типы одной группы.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.08.2017, 18:23
daslex, В цитате которую я привел написано, что bool, ..., и integer type вместе называются integral. В этой цитате отдельно упоминается bool, отдельно integer types. Вместе bool и integer называются integral. Как это разжевать вам подробнее, я не знаю.
Далее в стандарте еще есть сноска, что не существует signed, long и short bool. Патамушта short (при объявлении) - сокращение от short int. long = long int и т.д. int - сокращение от integer. Поэтому, везде где нельзя поставить int - это не integer type.

Добавлено через 8 минут
UPD: я знаю про extended integer types.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.08.2017, 18:30  [ТС]
avgoor, Я понял.

А теперь можно ответ на мой вопрос, из-за которого я создал тему, узнать?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.08.2017, 18:31
Цитата Сообщение от daslex Посмотреть сообщение
А теперь можно ответ на мой вопрос, из-за которого я создал тему, узнать?
Можно .
Правило преобразования в bool определяется другим параграфом: "4.12 Boolean conversions", и к narrowing conversion отношения не имеет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2017, 18:31
Помогаю со студенческими работами здесь

Приведение переменной типа istream к bool
Здравствуйте, Подскажите пожалуйста: int main() { string way = "C:\\11\\Text3.txt"; ifstream F; F.open(way);

При каком характерном размере d малый участок волновой поверхности может считаться плоским
Ответить на вопрос с объяснением. 1.На больших расстояниях от точечного источника сферическая волна может рассматриваться как плоская....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru