Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2009, 20:11   #1
GonZaleZ
Пользователь
 
Регистрация: 19.06.2009
Сообщений: 57
По умолчанию Странная задача.

Встретил в учебнике Страустрапа такую задачу:
Определите one следующим образом:
const one = 1;

Поменять значение one на 2.

Разве такое вообще возможно? о_О
GonZaleZ вне форума Ответить с цитированием
Старый 19.09.2009, 20:37   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

ну я вообще думал что можно:

Код:
#include <iostream>

using namespace std;

int main() {
	const int val = 1;
	const_cast<int&>(val) += 1;
	cout << val << endl;
	return 0;
}
но выводит старое значение, хотя в отладчике переменная изменилась. может из-за gcc так, не знаю.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 19.09.2009, 20:45   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от pproger
но выводит старое значение, хотя в отладчике переменная изменилась. может из-за gcc так, не знаю.
В VS2008 тоже, видимо одна из оптимизаций)
Кстати, если поместить объявление константы вне функции, то при попытке изменения вылетает ошибка нарушения прав доступа при записи на Win7))
netrino вне форума Ответить с цитированием
Старый 19.09.2009, 20:49   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2netrino
значит какие то приплюснутые приблуды, ибо код

Код:
int main() {
	const int val = 1;
	int *p;
	p = (int*)&val;
	(*p)++;
	printf("%d\n", val);
	return 0;
}
отрабатывает на сях, но не отрабатывает на плюсах)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 19.09.2009, 21:00   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, если я правильно понимаю разницу, то в C объявляется константная переменная, в то время, как в C++ это дело, не смотря на выделение под неё памяти, везде, где используется заменяется на объявленное значение(то бишь работает как #define в C)
netrino вне форума Ответить с цитированием
Старый 19.09.2009, 21:30   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
ну я вообще думал что можно:

Код:
#include <iostream>

using namespace std;

int main() {
	const int val = 1;
	const_cast<int&>(val) += 1;
	cout << val << endl;
	return 0;
}
но выводит старое значение, хотя в отладчике переменная изменилась. может из-за gcc так, не знаю.
Цитата:
Ну, если я правильно понимаю разницу, то в C объявляется константная переменная, в то время, как в C++ это дело, не смотря на выделение под неё памяти, везде, где используется заменяется на объявленное значение(то бишь работает как #define в C)
Да так и есть. Открыв в отладчике полученное, можно увидеть, что при вызове cout в стек заталкивается не переменная, а конкретное значение, т.е. 1. Хотя до этого к переменной и добавляется единица.
Изображения
Тип файла: jpg snap.jpg (29.9 Кб, 120 просмотров)
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 19.09.2009 в 21:53.
Goodwin98 вне форума Ответить с цитированием
Старый 19.09.2009, 21:56   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Угу, я уже тоже в олли поглядел мне вот только интересно, каков вообще смысл в выделении памяти под эту переменную, если оно всё равно не используется. В целях оптимизации, компилятор мог бы опускать это дело, ИМХО

-----
P.S. Пардон, компилятор проводит такую оптимизацию, забыл, что в дебаг-сборке оптимизация отключена))

Последний раз редактировалось netrino; 19.09.2009 в 22:00.
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная задача С. I курс. EniOk Общие вопросы C/C++ 19 22.06.2009 00:45
Странная задача ARF_name Паскаль, Turbo Pascal, PascalABC.NET 1 29.04.2009 11:24
Странная статья SunKnight Свободное общение 2 20.09.2008 00:31
Странная переменная. GreenDan Помощь студентам 6 25.08.2008 19:35
Странная загрузка Лубышев Операционные системы общие вопросы 9 17.03.2008 09:24