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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2009, 01:47   #1
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию язык C, switch

Добрый день, господа ПРОграммисты. Немного разбавлю тутошние студенческие вопросы...

сразу говорю, имеем дело с языком Си. имеется код:
Код:
#include "stdio.h"

const int two = 2;

int main() {
	int i = 2;
	switch (i) {
	case 1:
		break;
	case two:
		printf("%s\n", "two");
		break;
	default:
		break;
	}
	return 0;
}
компиляем, получаем:
Цитата:
pproger@pproger-desktop ~ $ gcc -std=c99 main.c
main.c: In function ‘main’:
main.c:28: error: case label does not reduce to an integer constant
объясните.
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 вне форума Ответить с цитированием
Старый 16.12.2009, 02:21   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

В селекторе switch должно быть константное выражение (т.е. число, явно заданная строка, NULL и пр.), а const int two - это переменная, просто компилятор следит, чтоб она не изменялась
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.12.2009, 02:22   #3
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Думается потому, что ты можешь написать
const int two = 2;
const int three = 2;

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

Точно! когда я написал
Код:
const int two = 2;
const int three = 2;

int main() {
	int i = 2;
	switch (i) {
	case 1:
		break;
	case two:
		printf("%s\n", "two");
		break;
	case three:
		printf("%s\n", "three");
		break;
	default:
		break;
	}
	return 0;
}
Мне сказали, что значение 2 уже использовалось!
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 16.12.2009, 11:55   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Greblin
Цитата:
В селекторе switch должно быть константное выражение (т.е. число, явно заданная строка, NULL и пр.), а const int two - это переменная, просто компилятор следит, чтоб она не изменялась
const int two = 2 это тоже константное выражение, поверь.

2RoS
Цитата:
Думается потому, что ты можешь написать
const int two = 2;
const int three = 2;

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

Цитата:
З.Ы. в с++ експресс студии все скомпилировалось
я как бы сказал, что язык используем СИ. Что в плюсах это работает я в курсе кэп.
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 вне форума Ответить с цитированием
Старый 16.12.2009, 16:42   #5
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

2pproger, извини, не поверю. Читаем Кернигана, пп. 2.3, 2.4
Цитата:
Константные выражения - это выражения, оперирующие только с константами. Такие выражения вычисляются во время компиляции, а не
во время выполнения
Цитата:
К любой переменной в объявлении может быть применен квалификатор const для указания того, что ее значение далее не будет изменяться.
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.12.2009, 16:59   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Greblin
Цитата:
Константные выражения - это выражения, оперирующие только с константами. Такие выражения вычисляются во время компиляции, а не
во время выполнения
хех. и что, к const int это определение не подходит?
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 вне форума Ответить с цитированием
Старый 16.12.2009, 17:14   #7
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Не подходит, const int - это переменная, значение которой не может быть вычислено во время компиляции. Вы же не будет утверждать, что например вот в таком коде
Код:
int i = 12321;
значение i известно до выполнения. А const это просто модификатор, причём кстати в том же Кернигане далее сказано, что реакция на попытку изменить такую переменную определяется конкретным компилятором
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.12.2009, 17:38   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Greblin
нет. значение const int как раз известно в момент компиляции. но мне уже интересна твоя теория) почему тогда в плюсах это имеет право на жизнь?
хотя может между си и плюсами квалификатор const имеет разный смысл...
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; 16.12.2009 в 17:59.
pproger вне форума Ответить с цитированием
Старый 16.12.2009, 18:17   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
хотя может между си и плюсами квалификатор const имеет разный смысл...
Именно так, помню, Страуструп на этом внимание акцентировал) собственно потому никто и не использовал никогда в C запись констант как const int, а пользовались #define'ом для этого.
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на switch ProgramerBeatz Общие вопросы C/C++ 12 25.01.2011 00:59
Switch с Фибоначчи Клайд Общие вопросы C/C++ 0 20.10.2009 20:16
SWITCH 8 портовый SKS Компьютерное железо 3 29.01.2009 03:39
Оператор switch. IgorArhangel Помощь студентам 4 16.01.2009 01:53
Switch Division Общие вопросы C/C++ 3 11.01.2009 23:52