Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
#1

Обьявление локальных переменных - C++

16.08.2012, 17:07. Просмотров 1028. Ответов 19
Метки нет (Все метки)

Добрый день. В какой последовательности объявляются локальные переменные в функции? Если вызвать return раньше обьявления, будет ли последующая переменная обьявлена? и почему нельзя объявлять переменные в конструкциях if или switch?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2012, 17:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обьявление локальных переменных (C++):

Обьявление переменных в циклах и до - C++
Возник вопрос почему? Без обьявления int x = 1; до цикла возникает ошибка при компиляции программы ... Хотя в книжке обьявление типа и...

Неинициализация локальных переменных - C++
Здравствуйте.Пишу в Visual studio 2012.Пишет что использованы неинициализированные локальные переменные sv и sn. Обьясните как правильно...

Рекурсия и никаких локальных переменных - C++
Нужно решить задание используя рекурсию и не используя никаких for,while и т.д.И локальных переменных. Входные данные: 5 - количество...

Время жизни локальных переменных в цикле - C++
Добрый вечер! допустим, в таком коде: int i=100; while(i>0) { int t = i+1; ... --i; }

Передача локальных переменных одной функции другой - C++
Добрый день, подскажите, как осуществить передачу локальных переменных получаемых в одной функции другой?Облазил гугл, ничего внятного...

Выделение и освобождение памяти для локальных переменных функций - C++
Привет Столкнулся со следующей проблемой. Написал простенькое приложение: читаем 1 строку из файла на диске, записываем 1 строку в файл...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
16.08.2012, 17:20 #2
в любой последовательности.
если вызвать return , то последующий код не будет выполнятся => и переменные не объявятся.
переменные можно объявлять в if и switch, но они будут локальны в пределах этой конструкции.
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
16.08.2012, 17:30  [ТС] #3
Цитата Сообщение от Leomana Посмотреть сообщение
в любой последовательности.
если вызвать return , то последующий код не будет выполнятся => и переменные не объявятся.
переменные можно объявлять в if и switch, но они будут локальны в пределах этой конструкции.
Дествительно переменные обьявляются, но почему-то в switch не объявляется(лся) класс, компилятор писал что объявление пропущено из за конструкции switch
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
16.08.2012, 17:53 #4
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Дествительно переменные обьявляются, но почему-то в switch не объявляется(лся) класс, компилятор писал что объявление пропущено из за конструкции switch
ну не знаю.. тут надо смотреть конкретный код
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
16.08.2012, 18:07  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <conio>
#include <iostream>
#
using namespace std;
 
class Foo
{
public:
    Foo()
    {
        cout << "Hello\n";
    }
};
 
int main()
{
    char c;
    while(c = getch())
    {
        switch(c)
        {
        case '1': Foo Bar; break;
        }
    }   
}
error C2360: пропуск инициализации "Bar" из-за метки "case"
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
16.08.2012, 18:19 #6
в моем MVS2010 ошибки нет
а что у Вас за компилятор?
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
16.08.2012, 22:59  [ТС] #7
MVS 2012

Добавлено через 5 минут
Прошу прощения, такой код срабатывает, а вот следующий - нет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <conio.h>
#include <iostream>
#
using namespace std;
 
class Foo
{
public:
    Foo()
    {
        cout << "Hello\n";
    }
};
 
int main()
{
    char c;
    while(c = getch())
    {
        switch(c)
        {
        case '1': Foo Bar; break;
        case '2': Foo FooBar;
        }
    }   
}
error C2360: пропуск инициализации "Bar" из-за метки "case"
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
16.08.2012, 23:02 #8
Можно этот код с Foo в отдельный блок заключить.
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
16.08.2012, 23:09  [ТС] #9
Цитата Сообщение от Somebody Посмотреть сообщение
Можно этот код с Foo в отдельный блок заключить.
Так работает, но ведь получится что он уничтожется после выхода из блока... а что бы он не уничтожался можно сделать?
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
16.08.2012, 23:24 #10
h3mbr0, зачем в 3 строке шарп (#)?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.08.2012, 23:34 #11
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Так работает, но ведь получится что он уничтожется после выхода из блока... а что бы он не уничтожался можно сделать?
Объявить вне switch. Засунув сам switch в блок. (Естессно, при этом для каждой итерации while будут новые переменные.)

А почему нельзя объявлять переменные в блоках if и switch — потому что у них синтаксис такой. В блоке if точно в скобках пишется не "обычное" выражение. Внутри switch сейчас попробую найти.
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
16.08.2012, 23:52  [ТС] #12
Цитата Сообщение от 4iFF Посмотреть сообщение
h3mbr0, зачем в 3 строке шарп (#)?
Привычка.. в начале инклуды, дефайны и неймспейсы разделяю шарпом для наглядности
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Объявить вне switch. Засунув сам switch в блок. (Естессно, при этом для каждой итерации while будут новые переменные.)

А почему нельзя объявлять переменные в блоках if и switch — потому что у них синтаксис такой. В блоке if точно в скобках пишется не "обычное" выражение. Внутри switch сейчас попробую найти.
Можно по подробнее? не совсем понял о чем идет речь
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.08.2012, 00:04 #13
Окей. Я посмотрел в стандарт. Это всё неправда про то, что нельзя объявлять.

После слова if или switch в скобках указывается условие (те же правила для условий switch, while и второго элемента for, но не для do-while). Условие — это или выражение (приводимое к bool), или объявление переменной. Если это выражение, то для выбора используется его значение. Если это объявление, то для выбора используется значение этой переменной. Переменная, объявляемая в этих скобках, является локальной для всего if или switch-оператора (то есть её нельзя переопределять). Если неясно, выражение это или объявление, оно считается объявлением.

То есть
вот это
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
  if (int x = 42) {
    std::cout << x;
  }
  else {
    std::cout << "NO";
  }
}
должно печатать 42.

Внутри switch можно объявлять переменные (равно как и в его условии, но только одну). Там обычные выражения со всеми вытекающими. Другое дело, что их инициализация зависит от того, на какой case мы прыгнем. То есть в
таком случае
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main()
{
  int c = 2;
  switch (c) {
  case 1:
    int x = 5;
    std::cout << x;
  case 2:
    int y = 6;
    std::cout << x + y;
    break;
  case 3:
    std::cout << 3;
  }
}
код для инициализации переменной x не будет выполнен и будет выведено чёрти что. Тот же gcc ругается на это как на ошибку, потому что это всё же серьёзный говнохитрокод, но ему можно заткнуть рот и получить свой undefined behavior, который должен быть по стандарту.
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
17.08.2012, 00:07  [ТС] #14
Спасибо, стало понятнее, но все таки раз если окончить блок до его дальнейшего выполнения, скажем
C++
1
2
3
4
5
{
int a;
return 0;
int b
}
b в этом случае объявлена не будет как я понимаю, так почему тогда нельзя в switch объявлять ту переменную, которую я выберу? то есть остальные просто проигнорировать? в этом собственно и заключался мой вопрос)
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.08.2012, 00:19 #15
Нет, формально она будет объявлена.
Такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int foo()
{
  return 42;
  int x = 2, y = 21;
  std::cout << x * y << " = ";
}
 
int main()
{
  std::cout << foo();
}
спокойно компилируется, хотя по понятным причинам выводит только 42, а не 42 = 42.

А почему нельзя объявлять то, что вы выберете... Вот смотрите, когда происходит выбор ветки switch? Во время исполнения программы. А когда происходит объявление переменной? При компиляции.

Объявить переменную при исполнении программы вы не можете (для этого потребуется тащить внутри программы целый компилятор Си++ и остальной фарш). Максимум можете её инициализировать динамически, во время выполнения программы.

Постарайтесь выразить нужные вам действия с помощью этой метафоры: при входе в switch у вас есть некая переменная, после выхода из switch она имеет значение, зависящее от условия, которое было передано в switch.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2012, 00:19
Привет! Вот еще темы с ответами:

Создание области определния для очистки временных локальных переменных - C++
Предположим, имеется некоторые доп. переменные, используемые только для нескольких действий в функции, а остаток функции (много больше, чем...

Объясните синтаксис программы по полочкам с использованием локальных переменных и прототипа функции - C++
Здравствуйте уважаемые форумчане. Вот читаю книгу по C++, не буду писать какую, дабы избежать критики и обсуждений. Хотелось бы что бы вы...

Требуется обьявление - C++
Здравствуйте, нужна помощь, не могу понять в чем проблема. Пытаюсь написать класс очереди для задания. Хочу написать цикл for, но for...

Обьявление функций - C++
Здравствуйте, уважаемые форумчане! Возник вопрос качательно обьявления функций. Сейчас читаю книгу Стивена Прата &quot;Язык программирования...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.08.2012, 00:19
Ответ Создать тему
Опции темы

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