Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/89: Рейтинг темы: голосов - 89, средняя оценка - 4.67
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170

изменение константы

10.04.2010, 19:56. Показов 18476. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, только начал учить с++, поэтому сильно не бейте
интересует такой гипотетический вопрос в целях обучения

C++
1
2
3
4
5
const int ic = 100;
int* ip = (int*)⁣
*ip = 50;
cout << &ic << " - " << ip << endl;// адрес одинаковый 
cout << ic << " - " << *ip << endl;// значения разные
как такое может быть?
ясно что код бредовый, и все же..
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2010, 19:56
Ответы с готовыми решениями:

Константы и C++
Скажите новичку зачем в C++ константы? И для чего они?

Константы препроцесора
А есть ли где-то список предустановленых констант препроцесора? Мне нужно узнать тип операционой системы, версию, и поочие. Есть ли где-то...

Экспоненциальные Константы
Всем доброго времени суток. Хотелось бы спросить такую вещь. Вид Экспоненциальной Константы же такой: {E|e} Тогда такая константа что...

11
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
10.04.2010, 20:15
вообще-то такого не должно быть, т.к. ic - константа, а значит менять ее значение нельзя
а тут значение ic меняется на 50 в 3 строчке и при этом у вас скомпилировало...бррр
а какой компилятор?
0
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
10.04.2010, 20:50  [ТС]
VS-2008
скомпилилось без ошибок, и что странно константа не изменилась (или это не странно), а указатель (пусть и не константный) на эту константу изменил значение, хотя адреса одинаковые...
самое странное получается что у одного адреса два значания..

Добавлено через 15 минут
хотя дебагер показует что у них одинаковые значения - 50 - 50, но выводит почему-то 100 - 50
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
10.04.2010, 20:54
думаю, это из-за приведения типа const int к int
0
3 / 3 / 0
Регистрация: 03.03.2009
Сообщений: 86
10.04.2010, 21:06
Это излишне
C++
1
int* ip = (int*)&ic;
При обращении к ссылке операция * производится автоматически.
C++
1
2
3
int* ip = (int*)&ic;
//заменить на 
int* ip = &ic;
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
10.04.2010, 21:21
Цитата Сообщение от ggg Посмотреть сообщение
int* ip = (int*)&ic;
//заменить на
int* ip = &ic;
так не выйдет потому что указатель не может указывать на константу
ic остается константой и ей нельзя присвоить другое значение, а вот ip указывает на неконстантную ic ((int*)ic), но вот почему у ip и ic разные значения при одном и том же адресе, я не пойму, ведь ip записывает куда-то свое новое значение....О_о
0
 Аватар для FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
10.04.2010, 21:24
Цитата Сообщение от ggg Посмотреть сообщение
Это излишне
C++
1
int* ip = (int*)&ic;
C++
1
2
3
int* ip = (int*)&ic;
//заменить на 
int* ip = &ic;
Так не будет компилироваться
хотя дебагер показует что у них одинаковые значения - 50 - 50, но выводит почему-то 100 - 50
очень интересная ситуация.
Интересно, что по этому поводу скажут зешние мастера
0
3 / 3 / 0
Регистрация: 03.03.2009
Сообщений: 86
10.04.2010, 21:40
Цитата Сообщение от Vorona Посмотреть сообщение
так не выйдет потому что указатель не может указывать на константу
ic остается константой и ей нельзя присвоить другое значение, а вот ip указывает на неконстантную ic ((int*)ic), но вот почему у ip и ic разные значения при одном и том же адресе, я не пойму, ведь ip записывает куда-то свое новое значение....О_о
Есть константный (неизменный) указатель.
Для него значение указателя менять нельзя.
Значение того, на что он указывает, менять можно.
C++
1
2
int &x = 2;
int *const y = &x
ip указывает на неконстантную ic ((int*)ic)
Как константная
C++
1
ic
стала не константной ????
C++
1
ic
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
10.04.2010, 21:52
не спорю)
но вы не имели ввиду константый указатель, вот я и поправил по данному контексту
но я все-равно не понимаю, как так получается с адресами

Добавлено через 4 минуты
Цитата Сообщение от ggg Посмотреть сообщение
ip указывает на неконстантную ic ((int*)ic)
Как константная
Код C++
1
ic
стала не константной ????
Код C++
1
ic
с этим я вообще запутался, вот и лажи написал(
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
10.04.2010, 22:21
Скорее всего компилятор просто фактически подставил вместо ic в строке:
C++
1
cout << ic << " - " << *ip << endl; // значения разные
50 ибо ic константа.
Проверить легко, вместо данной строки напишите:
C++
1
std::cout << *((int*)(&ic)) << " - " << *ip << std::endl;
2
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 12:31
В результате выполнения данного кусочка кода,*действительно константа ic должна изменится. В С++ даже есть специальный
C++
1
const_cast
позволяющий это делать. const лишь указывает компилятору, что менять данную переменную, когда она встречается в выражении, нельзя. В Си нету
C++
1
const_cast
, и такое преобразование ему аналогично.
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    const int ic = 100;
    int* ip = (int*)&ic;
    *ip = 50;
    printf("%x %x\n", &ic, ip);
    printf("%d %d\n", ic, *ip);
}
Этот код должен вывести второй строчкой два одинаковых значения.

Добавлено через 4 минуты
Не используйте в С++ function-style и с-style сastы.
1
Vlad_VS
06.03.2011, 20:41
Насколько я понял, компилятор, действительно, встраивает значение константы в месте её вызова.
Чтобы избежать этого, необходимо использовать ключевое слово volatile при объявлении константы.
Таким образом результат вышеуказанной программы, но с использованием volatile, у меня выглядел следующим образом:
12ff60 12ff60
50 50

А вот результат программы автора с применением volatile выглядит так:
1 - 0012FF60
50 - 50

Вот теперь не пойму почему cout выводит &ic как 1, а не 0012FF60, но printf() выводит правильно, показует именно 12ff60, а не 1.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.03.2011, 20:41
Помогаю со студенческими работами здесь

символьные константы
введите последовательность н- символьных констант, считать, что количество символов в слове не больше 20. 1.количество слов, что состоят...

Константы, вычисление...
Только начали учить с++ и уже завалили лабами на понедельник, а я его (с++) в глаза первый раз позавчера увидел :( времени осваивать...

Стринговые константы в С++
Програмка не работает. Обьясните,пожалуйста,в чем проблема... Само задание звучит так: Вести стринговые константы,найти наибольшое...

Константы и указатели
Как это работает? const int c = 2; const int* p1 = &amp;c; int* p2 = (int*)p1; *p2 = 3; std::cout &lt;&lt; c &lt;&lt; &quot; &quot; &lt;&lt; *p1 &lt;&lt;...

Классы и константы
Доброго дня! Возможно глупый вопрос: class def { int m,n,k; public: def(int mn){


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru