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

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

10.04.2010, 19:56. Просмотров 10725. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2010, 19:56
Ответы с готовыми решениями:

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

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

Экспоненциальные Константы
Всем доброго времени суток. Хотелось бы спросить такую вещь. Вид Экспоненциальной Константы же...

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

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

Добавлено через 15 минут
хотя дебагер показует что у них одинаковые значения - 50 - 50, но выводит почему-то 100 - 50
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
10.04.2010, 20:54 4
думаю, это из-за приведения типа const int к int
0
3 / 3 / 0
Регистрация: 03.03.2009
Сообщений: 86
10.04.2010, 21:06 5
Это излишне
C++
1
int* ip = (int*)&ic;
При обращении к ссылке операция * производится автоматически.
C++
1
2
3
int* ip = (int*)&ic;
//заменить на 
int* ip = &ic;
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
10.04.2010, 21:21 6
Цитата Сообщение от ggg Посмотреть сообщение
int* ip = (int*)&ic;
//заменить на
int* ip = &ic;
так не выйдет потому что указатель не может указывать на константу
ic остается константой и ей нельзя присвоить другое значение, а вот ip указывает на неконстантную ic ((int*)ic), но вот почему у ip и ic разные значения при одном и том же адресе, я не пойму, ведь ip записывает куда-то свое новое значение....О_о
0
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
10.04.2010, 21:24 7
Цитата Сообщение от 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 8
Цитата Сообщение от 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
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
10.04.2010, 21:52 9
не спорю)
но вы не имели ввиду константый указатель, вот я и поправил по данному контексту
но я все-равно не понимаю, как так получается с адресами

Добавлено через 4 минуты
Цитата Сообщение от ggg Посмотреть сообщение
ip указывает на неконстантную ic ((int*)ic)
Как константная
Код C++
1
ic
стала не константной ????
Код C++
1
ic
с этим я вообще запутался, вот и лажи написал(
0
Эксперт С++
2331 / 1704 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
10.04.2010, 22:21 10
Скорее всего компилятор просто фактически подставил вместо 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 11
В результате выполнения данного кусочка кода,*действительно константа 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 12
Насколько я понял, компилятор, действительно, встраивает значение константы в месте её вызова.
Чтобы избежать этого, необходимо использовать ключевое слово volatile при объявлении константы.
Таким образом результат вышеуказанной программы, но с использованием volatile, у меня выглядел следующим образом:
12ff60 12ff60
50 50

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

Вот теперь не пойму почему cout выводит &ic как 1, а не 0012FF60, но printf() выводит правильно, показует именно 12ff60, а не 1.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2011, 20:41

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

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

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

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

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


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

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

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