Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Можно понять, почему компилятор не может разобраться с указателями. Но почему он работает и что именно выводит (судя по всему, неопределённое поведение, но непонятно, на какие участки памяти смотрит). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Вывод такой обычно, причём число обычно меняется. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 17:39 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
baden_baden Код: plaintext 1. 2. компилятор виноват лишь в том, что позволяет выстрелить себе в ногу. ну зачем ты этот бред написал? что сказать этим хотел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 17:56 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Что тут непонятного? Это Код: plaintext 1. означает указание компилятору: "ты не умничай, а делай как я сказал, я за все отвечаю". Ну так и отвечай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 17:59 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Изопропил, из-за любознательности. А размеры полей же разные, верно? Значит, при печати (и других операциях) берутся соответствующие участки памяти, на которых может хранится всё, что угодно, потом эти участки обрабатываются, как соответствующие типы (в том числе неподходящие) -- из-за этого и получается неопределённое поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 18:01 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Нет тут неопределенного поведения. Все четко и однозначно, если понимаешь зачем такое пишешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 18:04 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
А почему тогда цифры разные появляются при исполнении? A::DoA 7023844 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 18:08 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
baden_badenА почему тогда цифры разные появляются при исполнении? A::DoA 7023844 Смотри реализацию std::string, внутрь которой ты лезешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 18:25 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
baden_badenА почему тогда цифры разные появляются при исполнении? A::DoA 7023844 посмотри исходник std::string и ассемблерное порождение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 18:29 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
В string память выделяется под массив char, а программа с участком выделяемой памяти работает, думая, что это int? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 18:56 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
разрывная, раскинул мозгами Штирлиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 19:07 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
baden_badenВ string память выделяется под массив char, а программа с участком выделяемой памяти работает, думая, что это int? Программа работает не думая. Думать это задача разработчика, как написал так и работает. Учи мат.часть, книжку какую-нибудь почитай, вместо того чтобы опыты ставить. Тут не физика, опыты не нужны, работает точно так как в документации написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 19:13 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Dima T, Не могли бы подсказать книжку, а лучше даже главу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2017, 19:36 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
baden_badenНе могли бы подсказать книжку, а лучше даже главу?Подозреваю, книжку такую ты вряд ли найдёшь. Советую посмотреть генерируемый ассемблерный код под дебагом, тогда всё станет понятно. Ну и основное уже сказали: компилятор сделал то, что ты просил, поэтому претензии к компилятору тут неуместны уже :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 05:29 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
baden_badenНе могли бы подсказать книжку, а лучше даже главу? Если такая книжка и есть, то она должна называться "С/С++ Вредные советы". Читай книги где пишут как делать правильно и старайся обойтись тем что написано, а не искать лайфхаки. Гугли про приведение типов . Там описано как это правильно делать. В твоем примере правильно сделать невозможно, т.к. в твоем коде изначально присутствует ошибка проектирования и исправлять надо ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 07:30 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли такая книжка и есть, то она должна называться "С/С++ Вредные советы". зачем же так сурово. подойдут главы книг по компиляторам, посвящённые кодогенерации, в частности - по управлению памятью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 07:43 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
Давай детально разберём код. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Класс A неполиморфный, содержит две переменных : int и string. int положим 4 байта, string содержит указатель на буфер или на реализацию буфера, положим ещё 4 байта. Код: plaintext 1. 2. 3. 4. 5. 6. Класс B, также неполиморфный, содержит одну переменную : string. которая содержит указатель на буфер или на реализацию буфера длиной 4 байта. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Мы объявляем переменную класса A, затем переменную класса B. Затем берём адрес переменной класса B и даём инструкцию интерпретировать его как адрес переменной класса A (тут кстати неопределённое поведение и будет при приведении void* к A* ) и хотим вызвать метод класса A через этот указатель. В классе B первая и единственная ячейка памяти размером в 4 байта содержит одну переменную : string. которая содержит указатель на буфер или на реализацию буфера. Функция DoA() будет интерпретировать эту ячейку как переменную A::i типа int и выведет её значение в cout. Что она при этом напечатает -- неизвестно, ибо там лежит неведомая хрень (указатель на буфер или на реализацию буфера длиной 4 байта) То же самое будет и во втором случае, но немного хуже -- при вызове << s может произойти защита памяти и крах приложения. И ещё раз -- тут два места с неопределённым поведением -- два привидения void* к A* и B*. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:09 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
MasterZiv да там можно просто показать кусочек ассемблерного кода, который лезет не туда в стеке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:33 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
CEMbда там можно просто показать кусочек ассемблерного кода, который лезет не туда в стеке Куда указано - туда и лезет. Мусор на выходе заказывали - получите и распишитесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:48 |
|
||
|
Почему такой код компилируется (про приведение типов)?
|
|||
|---|---|---|---|
|
#18+
ИзопропилКуда указано - туда и лезет. Мусор на выходе заказывали - получите и распишитесь.да, но я к тому, что лучше посмотреть на реализацию, и понять , как так получилось. Многие люди слишком абстрактно воспринимают концепции языка. А явные примеры компиляции кода хорошо ставят мозг на место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:59 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39443020&tid=2018192]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
161ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 271ms |
| total: | 527ms |

| 0 / 0 |
