Константные выражения [re: что такое UML?]

DiDiPi

Неконстантное выражение в switch Или в C# можно все , или UML должен генерить некомпилируемое

Dasar

где неконстантное?

DiDiPi

Скажи, на каком языке твой пример, а?

Dasar

ты сначала покажи неконстантное выражение.

DiDiPi

В С/С++ не может после case строка быть ("111" и т.д.)
в switch не может быть std::string,
а также полученный из нее const char*,
std::string s; s.c_str

Dasar

это понятно, не понятно почему ты обозвал это неконстантным выражением.
Константное выражение - это выражение, значение которого можно полностью вычислить во время компиляции
То, что слабенький C/С++-компилятор не может вычислить эту запись при компиляции - не делает автоматом - эту запись неконстантной.

DiDiPi

это понятно, не понятно почему ты обозвал это неконстантным выражением.
Я не знаю, что пишет простенький компилятор. Знаю, что такая конструкция в С неверна.
Пункты из стандарта, уж извини, не помню
Мог бы сказать проще - несоответствие типов для case (было бы ясно а мог бы сказать, что у тебя в switch/case указатель, а это (в общем случае говоря) не есть константное выражение.
Ты, кстати, так и не сказал, в каком языке этот пример правильный.

Dasar

> мог бы сказать, что у тебя в switch/case указатель, а это не есть константное выражение.
но указатель-то все равно константный получается.
> в каком языке этот пример правильный
в c#, например.

DiDiPi

значение которого можно полностью вычислить во время компиляции
но указатель-то все равно константный получается.
А теперь см. свое определение константного выражения (выше).
Ведь на этапе компиляции этот указатель (адрес по сути) неизвестен (в С).
в c#, например.
ОК. Верю. Можешь выкинуть в offtopic.

kamputer

>Ведь на этапе компиляции этот указатель (адрес по сути) неизвестен (в С).
Какой "этот"? Адрес строчки "111"?

Dasar

> Ведь на этапе компиляции этот указатель (адрес по сути) неизвестен (в С).
во-первых, если класть эти константы в static-память, то известны.
во-вторых, почему switch должен в данном случае бегать по указателям, а не по значению?

DiDiPi

> во-первых, если класть эти константы в static-память, то известны.
Нет. Компилятору известно смещение относительно PC или в GOT (смотря какая архитектура/ABI). Абсолютный адрес станет известен в момент запуска.
> во-вторых, почему switch должен в данном случае бегать по указателям, а не по значению?
Патамучта такпредумоле К&Р и пафтарил строуструупп.

Dasar

> Патамучта такпредумоле К&Р и пафтарил строуструупп.
т.е. для тебе является догмой конкретная реализация?

Julie16

Потому что значением "blablabla" является адрес. А строка - то что лежит по этому адресу.
Оставить комментарий
Имя или ник:
Комментарий: