Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
1

Сокрытие имен и область видимости

29.02.2020, 11:58. Показов 1743. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
int main(коллеги по "оружию")
Снова зову коллективный разум...
вот фрагмент кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 int i=10, j=100;
 
 if(j > 0)
 {
 int i;     // Эта переменная i отделена от внешней переменной i (она объявлена повторно, причем в блоке - if)
 i = j / 2;
 cout << "\n Внутренняя переменная i = " << i << '\n';  // переменная i принимает значение из результата выражения - j / 2
 }
 cout << "\n Внешняя переменная i = " << i << '\n';     // переменная i вне блока - if, сохраняет значение = 10
/////////////////////////////////////////////////////////////////////////////////
 
 
 if(j > 0)
 {
 i = j / 4;
 cout << "\n Внутренняя переменная i = " << i << '\n';  // переменная i внутри блока - if, принимает значение = 25
 }
 cout << "\n Внешняя переменная i = " << i << '\n';     // ниже, уже вне блока, она тоже имеет это значение "унаследованное" от блока - if
Вот результат
Сокрытие имен и область видимости


Не очень понятно почему в конце переменная i приняла значение = 25
ну то есть понятно конечно, взяла значение из второго блока - if
но ведь изначально она определена как =10
Почему так произошло?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2020, 11:58
Ответы с готовыми решениями:

Область видимости, пространства имен
имею макрос #define max(a,b) (((a) &gt; (b)) ? (a) : (b)) он определен в Windows.h, который мне...

Сокрытие имен
Доброго времени суток! Реально ли обратиться к x, который равен 7 из самого внутреннего блока? ...

Виртуальные методы vs. сокрытие имен
Доброго времени суток. Насколько я понял, виртуальный метод - это собственная вариация метода (аля...

Сокрытие имён страниц в строке адреса
Здравствуйте! Хочу чуть-чуть безопасности на сайте =) Научите пожалуйста, как можно скрыть...

20
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
29.02.2020, 12:09 2
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Не очень понятно почему в конце переменная i приняла значение = 25
Потому что 100 / 4 = 25
C++
1
i = j / 4; // где j = 100;
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
29.02.2020, 12:16  [ТС] 3
Цитата Сообщение от Undisputed Посмотреть сообщение
Потому что 100 / 4 = 25
Спасибо! 100 на 4 я умею делить!
Вопрос в другом, почему она взяла значение от переменной находящейся в блоке иф? В то время как в мейне она определена как = 10
0
92 / 65 / 27
Регистрация: 23.01.2020
Сообщений: 156
29.02.2020, 12:21 4
Она объявлена вне блока if (в самом верху кода), поэтому и живёт она вне блока тоже.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
29.02.2020, 12:23 5
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Спасибо! 100 на 4 я умею делить!
Вопрос в другом, почему она взяла значение от переменной находящейся в блоке иф? В то время как в мейне она определена как = 10
Потому что во втором блоке вы не объявили имя i затеняющеё имя объявленное вне блока. То есть, вы использовали внешнюю i во втором if'e. А на 100 оно без вас поделило. Тут умения не нужно.
1
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
29.02.2020, 12:24 6
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Вопрос в другом, почему она взяла значение от переменной находящейся в блоке иф? В то время как в мейне она определена как = 10
1. сначала да, там было 10
2. но потом бжик i = 100/ 4 в блоке, и стало 25
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
29.02.2020, 12:24 7
Лучший ответ Сообщение было отмечено R_U_S_V как решение

Решение

Цитата Сообщение от R_U_S_V Посмотреть сообщение
100 на 4 я умею делить!
я в этом не сомневался
Цитата Сообщение от R_U_S_V Посмотреть сообщение
почему она взяла значение от переменной находящейся в блоке иф?
как я понял речь о втором блоке if. почему вы решили что i взяла значение от переменной находящейся в блоке иф?
во втором блоке иф обращение шло не к локальной переменной.
если вы во втором блоке иф создадите переменную int i; тогда это уже будет работа с локальной переменной как это было в случае с первым иф
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
29.02.2020, 12:25  [ТС] 8
Цитата Сообщение от Mimilun Посмотреть сообщение
Она объявлена вне блока if (в самом верху кода), поэтому и живёт она вне блока тоже.
Правильно, так исходя из этого, она не должна изменять значение находясь в мейне! То по сути должна была остаться равной 10.
А тут получается она взяла значение от второго блока иф
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
29.02.2020, 12:27 9
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Правильно, так исходя из этого, она не должна изменять значение находясь в мейне! То по сути должна была остаться равной 10.
А тут получается она взяла значение от второго блока иф
Перечитайте что вам пишут.
1
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
29.02.2020, 12:28 10
обнаружил интересный парадокс:
очевидные вещи трудно объяснять,
потому, что объяснение выглядит сложнее самой сути объясняемого,
а значит должно ещё сложнее быть для понимания тому кому объясняют.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
29.02.2020, 12:32  [ТС] 11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Перечитайте что вам пишут.
Сижу читаю)))

Добавлено через 3 минуты
Я понимаю, что во втором блоке переменная не была объявлена! и поэтому была использована та, что находится в самом верху со стартовым значением = 10! И она во втором блоке принимает значение от деления 100 на 4.
То есть это переопределение повлияло и на внешнюю тоже получается?!
Ну то есть поскольку чтение кода происходит сверху вниз?
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
29.02.2020, 12:33 12
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Я понимаю, что во втором блоке переменная не была объявлена! и поэтому была использована та, что находится в самом верху со стартовым значением = 10! И она во втором блоке принимает значение от деления 100 на 4.
Это и есть ответ на ваш вопрос. Больше ничего додумывать не нужно.
1
92 / 65 / 27
Регистрация: 23.01.2020
Сообщений: 156
29.02.2020, 12:34 13
Это не переопределение, это присвоение. И это все одна и та же переменная, и вверху и в этом блоке.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
29.02.2020, 12:35 14
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Сижу читаю)))
Это правильно. Сидя - удобнее.
R_U_S_V, вложенная область видит все имена объявленные в предшествующих частях внешних областей, кроме тех, что перекрыты внутренними объявлениями в частях которые ниже перекрывающих объявлений внутри области. Исключением являются глобальные имена. Они доступны через разрешение :: .
Цитата Сообщение от XLAT Посмотреть сообщение
обнаружил интересный парадокс:
очевидные вещи трудно объяснять
XLAT, очевидно оно лишь по привычке. А начнёшь строго формулировать и удивишься, как оно загогулисто выходит.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
29.02.2020, 12:37  [ТС] 15
Еще переллельный вопрос, а подобные вопросы только у меня возникают? ну то есть я один такой тугой. Это нормально вообще? или подобное должно мне о чем то сигнализировать?

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
Это и есть ответ на ваш вопрос. Больше ничего додумывать не нужно.
То есть в данном случае мы забыли про первичное значение! Ну что могу сказать, пока понятно, но на половину возможно потом дойдет окончательно)))
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
29.02.2020, 12:41 16
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Это нормально вообще
Нормально. Не вы один такой
Цитата Сообщение от R_U_S_V Посмотреть сообщение
То есть в данном случае мы забыли про первичное значение!
Не то что бы забыли. Просто записали в переменную новое значение вот и все...
C++
1
2
3
4
5
6
7
int main()
{
    int i = 10;
    std::cout << i << '\n';
    i = 25;
    std::cout << i;
}
вас ведь не удивляет что программа печатает сначала 10 а потом 25?
переменная у нас как бы одна, и в разное время она может принимать разные значения
у вас аналогичная ситуация просто там еще навешаны условия что возможно и путает вас.
1
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
29.02.2020, 12:42 17
Цитата Сообщение от R_U_S_V Посмотреть сообщение
или подобное должно мне о чем то сигнализировать?
умение формулировать вопросы, ценнее чем отвечать на них.

смотрите:
Предположим, что кто-то когда-то построил абсолютный решатель абсолютно любых задач.
Но он ничего не делает!
Почему?
Потому что строители забыли про того, кто будет давать ему задачи на решение.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
29.02.2020, 12:47  [ТС] 18
"РЕБЯТ" сорри за фамильярноть, ну уж очень хотелось!
Все понял, собственно как сам и думал так и оказалось:
Поскольку второй блок использует глобальную переменную i = 10;
то в нем она и изменила значение не только внутри но и ниже по коду!
СХЕХ БЛАГОДАРЮ, СОРРИ ЗА МОЮ ....

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
std::cout << i << '\n';
А чтоб std-ши не писать разьве этого - using namespace std; не достаточно в "шапке" ?

У меня на старте всегда вот так:
C++
1
2
3
4
5
6
#include <windows.h>
#include <iostream>
using namespace std;
 
int main()
{
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
29.02.2020, 12:48 19
Цитата Сообщение от R_U_S_V Посмотреть сообщение
А чтоб std-ши не писать разьве этого - using namespace std; не достаточно в "шапке" ?
Достаточно. Но иногда использование using namespace std; может приводить к тому что ваш код просто не будет компилироваться.
Не спрашивайте почему Когда будете изучать тему пространства имен - тогда уже можно будет об этом говорить
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
29.02.2020, 12:50  [ТС] 20
Цитата Сообщение от Undisputed Посмотреть сообщение
Достаточно. Но иногда использование using namespace std; может приводить к тому что ваш код просто не будет компилироваться
ААА понял!
0
29.02.2020, 12:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.02.2020, 12:50
Помогаю со студенческими работами здесь

Область видимости
У меня возникла проблема с областью видимости. вот у меня два класса class Obj { ...

Область видимости
Есть код: $id = 0; $res = $link-&gt;query( &quot;SELECT id, last_update FROM `before` ...

Область видимости
Здравствуйте, помогите решить задачу, пожалуйста имеем такой код: for(var i in scrolling){ ...

Область видимости
привет, почему в этом нет ошибки? Почему из edit вызывается Set? ведь у вызова this.Set() - this...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru