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

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

Войти
Регистрация
Восстановить пароль
 
uranium_238
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 27
#1

Вопрос об области видимости переменной - C++

24.01.2014, 16:30. Просмотров 547. Ответов 7
Метки нет (Все метки)

У меня в проге один главный цикл и в этом цикле еще 4 цикла. Так вот, в начале главного цикла я написал int i =0; Вопрос, этот i = 0 будет для всей проге задан или когда прога перейдет в следущий цикл или if else она обнулится? Например я в первом if else или цикле задал int i = 0, во втором цикле или if else будет задано, что есть переменная i типа int со значением 0 или это значение действует только до следущего цикла или f else, с переходом на одно из них оно недействительно и нужно заного писать?
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
27
28
29
30
int main()
{
    setlocale(0, "Russian");
    int c, i = 0;  //вот тут задано что есть int i = 0!
    cout << "\t\t***Многофункциональный калькулятор***\n\n";
    do
    {
        cout << "\nВыбирите мод:\nОбычный:\t\t[1]\nКв. корень:\t\t[2]\nУр-ие вида ax^2+bx+c:\t[3]\nТригонометрические ф-ии:[4]\nВаш выбор: ";
        cin >> c;
        if (c == 1)
        {
            double a, b, rez;
            char z;
            int i = 0; //нужно ли тут вписывать это? или та первая надпись является значением и этого?
            cout << endl << "_________________________" << endl;
            cout << "Вы включили мод: обычный." << endl;
            cout << "-------------------------";
            do
            {
                cout << "\nВведите число_знак_число: ";
                cin >> a >> z >> b;
                switch (z)
                {
                case '+': rez = a + b; cout << "Результат: " << rez; break;
                case '-': rez = a - b; cout << "Результат: " << rez; break;
                case '*': rez = a*b; cout << "Результат: " << rez; break;
                case '/': rez = a / b; cout << "Результат: " << rez; break;
                default: cout << "Ошибка!";
                }
            } while (i < 1);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.01.2014, 16:37     Вопрос об области видимости переменной #2
переменная видна только в то области видимости в которой она объявлена, соответственно так
C++
1
2
3
4
5
6
7
8
if()
{
int i = 0;
}
else 
{
i = 50;
}
не будет работать потомучто ветка else это другая область видимости

или еще пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if()
{
int i = 0;
if()
{
int i = 10;
cout<<i;//тут будет вывод посл объявленной i потому что при повторном объявлении i обяъвленная выше будет скрыта последним объявлением
}
else
{
 
}
}
else
{
 
}
uranium_238
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 27
24.01.2014, 17:16  [ТС]     Вопрос об области видимости переменной #3
aLarman, как определить в какой области объявлена переиенная и когда она не будет действовать??
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.01.2014, 17:40     Вопрос об области видимости переменной #4
Цитата Сообщение от aLarman Посмотреть сообщение
переменная видна только в то области видимости в которой она объявлена
ну зачем так неосторожно. Можно ведь получить доступ к глобальной переменной внутри функции, даже если в функции определена своя, локальная переменная, с таким же именем.
см. оператор разрешения области видимости
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
24.01.2014, 17:58     Вопрос об области видимости переменной #5
Цитата Сообщение от uranium_238 Посмотреть сообщение
как определить в какой области объявлена переиенная и когда она не будет действовать?
Она должна быть объявлена до обращения к ней, пример 1 aLarman-а очень нагляден:
C++
1
2
3
4
5
6
7
8
if()
{
int i = 0;
}
else 
{
i = 50;
}
Если условие 1 не выполняется то переход сразу на 7 строчку, т.е. минуя 3 строчку где она объявляется
Вообще объявление в строчке 3, то он будет видна в коде между 3 и 4 строчками. Вот еще один пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main()
{
int i=0;
if (true)
{
    int i=4;//Это переопределение i
    cout<<i<<endl; //здесь выдаст 4 и эта фактически последняя строчка где она видна с новым определение
}
cout<<i<<endl;// а здесь выдаст 0 т.к. то определение здесь уже не видно, т.к. мог быть случай что if не сработал, т.е не было бы нового определения int i=4; 
system("Pause");
}
Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
ну зачем так неосторожно. Можно ведь получить доступ к глобальной переменной внутри функции, даже если в функции определена своя, локальная переменная, с таким же именем.
см. оператор разрешения области видимости
Ну высший пилотаж
это не для новичков это тогда ошибки в их кодах искать можно годами)

Добавлено через 11 минут
Решил привести такой пример до кучи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdlib>
#include <iostream>
int i=0;//глобальная переменная
using namespace std;
 
 
int main()
{
int i=0,k=1;
if (k==1)
{
    int i=4;//локальная переменная
    cout<<i<<endl;//Здесь 4 обращение к локальной
    cout<<::i<<endl; //Здесь 0 обращение к глобальной
}
cout<<i<<endl;////Здесь 0 обращение к глобальной
system("Pause");
}
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 20:02     Вопрос об области видимости переменной #6
Цитата Сообщение от mustimur Посмотреть сообщение
16) cout<<i<<endl;////Здесь 0 обращение к глобальной
С чего бы это?
Вот так нипишите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
i#include <cstdlib>
#include <iostream>
int i = 0;//глобальная переменная
using namespace std;
 
 
int main()
{
int i = 3,k = 1;
if (k==1)
{
    int i=4;//локальная переменная
    cout<<i<<endl;//Здесь 4 обращение к локальной
    cout<<::i<<endl; //Здесь 0 обращение к глобальной
}
cout<<i<<endl;////Здесь 3 обращение к локальной, объявленной в main() до if().
system("Pause");
}
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
24.01.2014, 20:05     Вопрос об области видимости переменной #7
Цитата Сообщение от alsav22 Посмотреть сообщение
С чего бы это?
Точно, я копируя забыл удалить первый int в main, задумывалось так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdlib>
#include <iostream>
int i=0;//глобальная переменная
using namespace std;
 
 
int main()
{
int k=1;
if (k==1)
{
    int i=4;//локальная переменная
    cout<<i<<endl;//Здесь 4 обращение к локальной
    cout<<::i<<endl; //Здесь 0 обращение к глобальной
}
cout<<i<<endl;////Здесь 0 обращение к глобальной
system("Pause");
}
Но вам спасибо, еще один пример создали по теме))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 02:37     Вопрос об области видимости переменной
Еще ссылки по теме:

C++ Изменение области видимости функции
C++ Области видимости функций
Возможно ли спрятать класс из области видимости? C++
C++ Области видимости
C++ Расширение области видимости класса, за пределами цикла

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6221 / 3466 / 424
Регистрация: 29.11.2010
Сообщений: 9,177
25.01.2014, 02:37     Вопрос об области видимости переменной #8
до кучи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int i; // глобальная переменная i
 
void foo()
{
    std::cout << i << " ";
}
 
int main()
{
    foo(); // неинициализированные явно глобальные переменные равны 0
    int i = 2;
    foo();  // объявление локальной переменной i никак не влияет на глобальную переменную
    ::i = 1;
    foo();  // значение глоабльной переменной i поменялось (явно указали global scope)
}
Yandex
Объявления
25.01.2014, 02:37     Вопрос об области видимости переменной
Ответ Создать тему
Опции темы

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