298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|
1 | |
Обьявление локальных переменных16.08.2012, 17:07. Показов 2165. Ответов 19
Метки нет (Все метки)
Добрый день. В какой последовательности объявляются локальные переменные в функции? Если вызвать return раньше обьявления, будет ли последующая переменная обьявлена? и почему нельзя объявлять переменные в конструкциях if или switch?
0
|
16.08.2012, 17:07 | |
Ответы с готовыми решениями:
19
Обьявление переменных в циклах и до Обьявление и инициализация переменных в цикле: как это работает (что там происходит)? Неинициализация локальных переменных Рекурсия и никаких локальных переменных |
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
|
|
16.08.2012, 17:20 | 2 |
в любой последовательности.
если вызвать return , то последующий код не будет выполнятся => и переменные не объявятся. переменные можно объявлять в if и switch, но они будут локальны в пределах этой конструкции.
1
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|
16.08.2012, 17:30 [ТС] | 3 |
Дествительно переменные обьявляются, но почему-то в switch не объявляется(лся) класс, компилятор писал что объявление пропущено из за конструкции switch
0
|
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
|
|
16.08.2012, 17:53 | 4 |
0
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
||||||
16.08.2012, 18:07 [ТС] | 5 | |||||
0
|
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
|
|
16.08.2012, 18:19 | 6 |
в моем MVS2010 ошибки нет
а что у Вас за компилятор?
0
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
||||||
16.08.2012, 22:59 [ТС] | 7 | |||||
MVS 2012
Добавлено через 5 минут Прошу прощения, такой код срабатывает, а вот следующий - нет:
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
16.08.2012, 23:02 | 8 |
Можно этот код с Foo в отдельный блок заключить.
1
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|
16.08.2012, 23:09 [ТС] | 9 |
Так работает, но ведь получится что он уничтожется после выхода из блока... а что бы он не уничтожался можно сделать?
0
|
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
|
|
16.08.2012, 23:24 | 10 |
h3mbr0, зачем в 3 строке шарп (#)?
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
16.08.2012, 23:34 | 11 |
Объявить вне switch. Засунув сам switch в блок. (Естессно, при этом для каждой итерации while будут новые переменные.)
А почему нельзя объявлять переменные в блоках if и switch — потому что у них синтаксис такой. В блоке if точно в скобках пишется не "обычное" выражение. Внутри switch сейчас попробую найти.
0
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|
16.08.2012, 23:52 [ТС] | 12 |
Привычка.. в начале инклуды, дефайны и неймспейсы разделяю шарпом для наглядности
Можно по подробнее? не совсем понял о чем идет речь
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|||||||||||
17.08.2012, 00:04 | 13 | ||||||||||
Окей. Я посмотрел в стандарт. Это всё неправда про то, что нельзя объявлять.
После слова if или switch в скобках указывается условие (те же правила для условий switch, while и второго элемента for, но не для do-while). Условие — это или выражение (приводимое к bool), или объявление переменной. Если это выражение, то для выбора используется его значение. Если это объявление, то для выбора используется значение этой переменной. Переменная, объявляемая в этих скобках, является локальной для всего if или switch-оператора (то есть её нельзя переопределять). Если неясно, выражение это или объявление, оно считается объявлением. То есть вот это
Внутри switch можно объявлять переменные (равно как и в его условии, но только одну). Там обычные выражения со всеми вытекающими. Другое дело, что их инициализация зависит от того, на какой case мы прыгнем. То есть в таком случае
1
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
||||||
17.08.2012, 00:07 [ТС] | 14 | |||||
Спасибо, стало понятнее, но все таки раз если окончить блок до его дальнейшего выполнения, скажем
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
17.08.2012, 00:19 | 15 | |||||
Нет, формально она будет объявлена.
Такой код
А почему нельзя объявлять то, что вы выберете... Вот смотрите, когда происходит выбор ветки switch? Во время исполнения программы. А когда происходит объявление переменной? При компиляции. Объявить переменную при исполнении программы вы не можете (для этого потребуется тащить внутри программы целый компилятор Си++ и остальной фарш). Максимум можете её инициализировать динамически, во время выполнения программы. Постарайтесь выразить нужные вам действия с помощью этой метафоры: при входе в switch у вас есть некая переменная, после выхода из switch она имеет значение, зависящее от условия, которое было передано в switch.
1
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|||||||||||
17.08.2012, 00:28 [ТС] | 16 | ||||||||||
Все, теперь понял, спасибо
Еще один маленький вопрос, нехочу создавать для нее отдельную тему. Есть ли в c++ аналог
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
17.08.2012, 00:43 | 17 | |||||
К сожалению, нету. Если это числа, то придётся воспользоваться if, строя вот такой паровоз из интервалов:
1
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|
17.08.2012, 01:06 [ТС] | 18 |
//написал не подумав, вопрос исчерпан, спасибо за помощь
0
|
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
|
||||||
17.08.2012, 01:23 | 19 | |||||
Возвращаясь к главной теме: чтобы решить проблему с инициализацией во время компиляции в switch'e, нужно все выражения после case'a заключать в фигурные скобки {}. Вот этот код работает
0
|
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
|
|
17.08.2012, 01:32 [ТС] | 20 |
Тут уже предлагали такой способ, но мне нужно было что бы после выхода из switch класс оставался, а таким способом он уничтожается сразу после switch
0
|
17.08.2012, 01:32 | |
17.08.2012, 01:32 | |
Помогаю со студенческими работами здесь
20
Время жизни локальных переменных в цикле Передача локальных переменных одной функции другой Выделение и освобождение памяти для локальных переменных функций Вернуть значения локальных переменных подпрограммы в вызывающую функцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |