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

Стенли Б. Липпман, преобразования в логическихвыражениях

29.06.2021, 10:01. Показов 6619. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Из учебника:

при использовании значения типа bool в арифметическом
выражении оно всегда преобразуется в 0 или 1.

Я написал:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main()
{
    int i = 15;
    if (i)
        cout << i;
    return 0;
}
Как было i = 15, так и осталось.
В то же время, если записать:
i = 1.5
cout <<i;
то выдаст 1 (здесь float преобразуется к int)
Кто мне объяснит, почему в одном случае преобразование идёт, а в другом нет?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2021, 10:01
Ответы с готовыми решениями:

Итераторы Стенли Б. Липпман Язык программирования C++ 5-е издание
Можете переписать данный код используя итераторы. Прост не понимаю где именно должны здесь быть итераторы задача взята из книги Стенли ...

Язык программирования С++. Вводный курс 4-е изд. Стенли Липпман[2007]
Стоит ли читать данную книгу новичку? Язык программирования С++. Вводный курс 4-е изд. Стенли Липпман

Язык программирования C++ Базовый курс Стенли Б. Липпман Жози Лажойе Барбара Э.Му"
Задача из учебника: упражнение 1.20. По адресу http://www.informit.com/title/032174113 в каталоге кода первой главы содержится...

60
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
29.06.2021, 11:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
преобразуете значение переменной к другому типу
извините конечно, двояко как то звучит
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
29.06.2021, 11:12
Лучший ответ Сообщение было отмечено Walex как решение

Решение

Цитата Сообщение от qppq Посмотреть сообщение
извините конечно, двояко как то звучит
Только если вы уже "загрузили" себя какими-то ненужными домыслами.

Объект и значение - отдельные независимые сущности. Операции, производимые над значением, никак не влияют на объект. Чтобы изменить объект, нужно производить операции над самим объектом.
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
29.06.2021, 11:19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"загрузили" себя какими-то ненужными домыслами.
ага понял, это про автоматитски float в int можно так сказать
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
29.06.2021, 11:23  [ТС]
Ещё раз, спасибо всем!
Я свою ошибку понял: преобразуется не сама переменная. В определённых условиях преобразуется её значение, которое можно присвоить другой переменной. Но в учебнике Липпмана на этом внимание не концентрируется.
0
 Аватар для vvm28
773 / 541 / 67
Регистрация: 22.12.2013
Сообщений: 2,500
Записей в блоге: 26
29.06.2021, 15:24
Некоторая ассоциативная аналогия.
Представьте себе переменную как ящик, в котором хранятся какие-то предметы.
Эти предметы могут быть определенного типа - это грубо говоря значения.
А на ящиках есть надписи, какие значения могут в них храниться. Это тип переменной.
Можно представить себе ящики, к примеру различной формы, так как в них хранятся различные типы.

Когда вы приводите тип переменной, то вы как-бы меняете форму ящика, для хранения значений другого типа.
Но есть некоторые правила приведения. То есть не все типы переменных вы можете преобразовать из одних в другие.

Тип переменной - это только некоторое качество переменной, то есть некоторый вид переменной.
А значение - некоторый больше количественный показатель.

Добавлено через 21 минуту
PS. Саму переменную вы можете, грубо говоря представить как тару для хранения данных.
Эта тара подходит для хранения определенного типа данных. Для других данных она не подходит.
Чтобы она подходила для хранения других данных, переменную нужно привести к другому типу.
При этом точность может потеряться при приведении. К тому-же существуют некоторые правила по которым
можно приводить только определенные типы к другим типам данных.
1
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
01.07.2021, 16:14  [ТС]
DrOffset,
Ценю ваши знания и квалификацию, поэтому обращаюсь с просьбой лично к вам.
Замучился читать и разгадывать подобные перлы из учебника:

"Привязка ссылки к константному
объекту ничего не говорит о том, является ли сам основной объект
константой."

И подобное встречается постоянно!

Возможно мне досталась пиратская версия с машинным переводом. Вы можете дать ссылку на нормальный учебник Липпмана? Я имею в виду, с нормальным переводом. Или я просто не понимаю, что имеется в виду?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.07.2021, 16:22
Цитата Сообщение от Walex Посмотреть сообщение
Привязка ссылки к константному объекту ничего не говорит о том, является ли сам основной объект константой.
Абсолютно корректная фраза, что в ней вызвало затруднение?
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
01.07.2021, 16:28  [ТС]
Видимо, с подобным стилем придётся просто смириться. Но, на взгляд "чайника", первое впечатление, покуда не вник глубоко, не опробовал на компиляторе, смысл фразы звучит так: "если я сделал ссылку на константу, то это не значит, что то, на что я сделал ссылку - это константа"
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.07.2021, 16:32
Цитата Сообщение от Walex Посмотреть сообщение
"если я сделал ссылку на константу, то это не значит, что то, на что я сделал ссылку - это константа"
Так оно и есть.

C++
1
2
3
int a = 10;
 
const int & ra = a; // если я сделал ссылку на константу, то это не значит, что то, на что я сделал ссылку - это константа
1
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
01.07.2021, 16:35  [ТС]
Я уже писал вам, что использовал компьютер как печатную машинку. Когда я пишу статьи, я понимаю, что пишу я их не для ровни себе. Поэтому, написав, я ещё раз их перечитываю, стараясь представить себе, что вижу этот материал в первый раз. Многое приходится переделывать.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.07.2021, 16:37
Walex, пример из реальной жизни. Вы живете в доме, и у дома есть название улицы и номер. Вы можете его поменять? Нет. Но городские власти могут. Они могут переименовать улицу и поменять нумерацию домов. Придет рабочий и закрасит старое название, напишет новое.
Получается, что у вас - константная ссылка на номер дома. Вы можете им пользоваться, читать и копировать это число куда хотите. Но изменить не можете. Но это не значит, что никто не может.

Добавлено через 1 минуту
Цитата Сообщение от Walex Посмотреть сообщение
Я уже писал вам, что использовал компьютер как печатную машинку. Когда я пишу статьи, я понимаю, что пишу я их не для ровни себе. Поэтому, написав, я ещё раз их перечитываю, стараясь представить себе, что вижу этот материал в первый раз. Многое приходится переделывать.
Я не понимаю что в данном случае можно переделать? Это просто факт, его по-другому никак не написать, только так.
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
01.07.2021, 16:47  [ТС]
Это я вполне разобрал и понял. Но первым делом понимаешь ссылку, как ссылку на объект "а", а вовсе не на "const int". Вы это разбираете легко, потому что ЗНАЕТЕ. Впрочем, я уже понял, что придётся продираться через подобное. Спасибо за отклик. Ни от кого другого я так легко эту информацию не принял бы и зря продолжал бы поиски нового учебника.

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Я не понимаю что в данном случае можно переделать? Это просто факт, его по-другому никак не написать, только так.
Вполне можно было бы снизойти к таким как я и уточнить, что под объектом в данном случае подразумевается "const int". То есть, взглянуть на фразу (и не только эту) глазами "чайника"
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.07.2021, 17:00
Цитата Сообщение от Walex Посмотреть сообщение
Вы это разбираете легко, потому что ЗНАЕТЕ
не уверен в этом. Я еще помню, как это было когда я не знал. В целом концепция псевдонима с константным квалификатором никогда лично у меня затруднений не вызывала.
Это выразительное средство для моделирования вполне жизненной ситуации в коде - "вот тебе средство доступа к чему-либо, но менять через него это что-либо нельзя".

Цитата Сообщение от Walex Посмотреть сообщение
что под объектом в данном случае подразумевается "const int"
Под объектом подразумевается любой экземпляр (переменная) объектного типа.
0
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
01.07.2021, 17:18  [ТС]
Вот, я начинаю новую главу и читаю:

2.4.2. Указатели и спецификатор const
Подобно ссылкам, вполне возможно определять указатели, которые
указывают на объект константного или неконстантного типа.

Вот что здесь написано? Имеется в виду, что это будут указатели ОТ константного или не константного типа (const *int) или это будут указатели на другой какой-то объект (const*int a = &b)? То есть, сами указатели указывают, что они константы либо объект - это константа? После примера со ссылками я уже ни за что не поручусь.
Можно не отвечать, думаю, разберусь сам, это я для примера.

Добавлено через 14 минут
Не могу не поделиться: Липпман, стр 107.

В разделе 2.3.2 упоминалось о наличии двух исключений из правила,
согласно которому типы указателя и объекта, на который он указывает,
должны совпадать. Первое исключение — это возможность использования
указателя на константу для указания на неконстантный объект:

double dval = 3.14; // dval типа double; ее
значение неизменно
cptr = &dval; // ok: но изменить dval при
помощи cptr нельзя

Где здесь константный объект и указатель?!
Если вы их мне найдёте, мне останется признать, что я идиот.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.07.2021, 17:20
Цитата Сообщение от Walex Посмотреть сообщение
Вполне можно было бы снизойти к таким как я и уточнить, что под объектом в данном случае подразумевается "const int"

Вот объясняется что такое объект.


Вот объясняется что такое ссылка и что значит "привязать".

Цитата Сообщение от Walex Посмотреть сообщение
Подобно ссылкам, вполне возможно определять указатели, которые
указывают на объект константного или неконстантного типа.
Написано ровно то, что имеется в виду. У вас может быть указатель на константный объект, а может быть указатель на неконстантный объект.
Будет ли объект считаться константным при доступе через указатель, или не будет, - указывается прямо в типе этого указателя (или ссылки).


Вообще, для многих новичков это сложно (указатели и ссылки), так что учебник не при чем. В учебнике написано все предельно понятно, но из-за традиционной сложности восприятия самой концепции вам это сразу не дается. Вы либо справитесь с этим, либо нет. Менять учебник нет смысла, лучше не станет (никто не будет как я пытаться пережевывать это для вас и объяснять на аналогиях).
Миниатюры
Стенли Б. Липпман, преобразования в логическихвыражениях  
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.07.2021, 17:29
Цитата Сообщение от Walex Посмотреть сообщение
double dval = 3.14; // dval типа double; ее
значение неизменно
cptr = &dval; // ok: но изменить dval при
помощи cptr нельзя
Где здесь константный объект и указатель?!
Если вы их мне найдёте, мне останется признать, что я идиот.
А что ж вы из контекста-то вырвали код? Там же совсем не так написано:
0
 Аватар для vvm28
773 / 541 / 67
Регистрация: 22.12.2013
Сообщений: 2,500
Записей в блоге: 26
01.07.2021, 17:46
int *pa =

* - разименование.

в переменной pa - будет храниться значение адреса.

Операция взятия адреса &. Вы берете адрес объекта &a - вы взяли адрес объекта.

Здесь еще нужно рассмотреть некоторый нюанс const int *pa и int const *pa
То есть это сама константа или указатель на константу.

Здесь нужно понять является ли сам объект константой или константой является тот адрес по которому хранится объект.
И другая сторона - является ли сам указатель константой или он указывает на константный объект.


Хорошая идея дать понятные объяснения с примерами.

Добавлено через 10 минут
Чтобы было проще понять нужно рассмотреть вопрос как происходит выделение памяти под объект и как происходит освобождение памяти выделенной под объект.
1
0 / 0 / 0
Регистрация: 15.06.2021
Сообщений: 174
01.07.2021, 17:56  [ТС]
доделайте хорошее дело, не оставляйте во тьме!
Вы привели более полную цитату из учебника. Я этот момент видел, но меня сбило следующее:

1)double dval = 3.14; // dval типа double; ее
значение неизменно

Это здесь причём и почему это оно неизменно?

2)cptr = &dval;
Разве этим мы не меняем адрес константного указателя? Такое можно? И что при этом происходит?

Добавлено через 9 минут
Как и любой другой константный объект,
константный указатель следует инициализировать, после чего изменить
его значение (т.е. адрес, который он содержит) больше нельзя.

Я не верю, что подобные выкрутасы нельзя было изложить проще и яснее.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.07.2021, 18:09
Лучший ответ Сообщение было отмечено Walex как решение

Решение

Цитата Сообщение от Walex Посмотреть сообщение
1)double dval = 3.14; // dval типа double; ее значение неизменно

Это здесь причём и почему это оно неизменно?
Это скорее всего просто опечатка из книги. Сделали копипасту из предыдущего варианта и кусок "ее значение неизменно" забыли убрать. Ничего неизменного в dval нет.

Цитата Сообщение от Walex Посмотреть сообщение
2)cptr = &dval;
Разве этим мы не меняем адрес константного указателя? Такое можно? И что при этом происходит?
Что означает фраза "меняем адрес указателя"?

cptr - неконстантный указатель. И мы здесь присваиваем новое значение этому неконстантному указателю.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.07.2021, 18:14
Walex, ошибка перевода получается. Вот почему лучше читать оригинал. В оригинале пишет что: "dval типа double; ее значение можно изменить".
Миниатюры
Стенли Б. Липпман, преобразования в логическихвыражениях  
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2021, 18:14

Лефоре или Липпман?
Доброго времени суток. Как вы считаете, какой книгой лучше воспользоваться для осознания принципов С++? &quot;Объектно-ориентированное...

Липпман или Шилдт
Знаю, что темы &quot;что читать новичку&quot; создавались уже миллион раз. Я, собственно, многие из прочитал (на этом сайте и на других). Эксперты...

Консультации.[Липпман/Лажойе]
Приветствую. Начал изучение языка C++ с книги Стенли Б.Липпмана и Жози Лажойе &quot;Язык программирование C++. Третье издание&quot;. Про...

перегрузка операции ++ (Липпман)
как можна перегрузить данную операцию #include&lt;iostream&gt; #include&lt;complex&gt; using namespace std; inline complex&lt;double&gt;&amp; ...

Изучение С++11: Липпман или Прата?
Поделитесь общими впечатлениями или мнениями по этим двум книгам


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru