Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 25.08.2021
Сообщений: 92

Область видимости переменной

31.08.2021, 05:43. Показов 2337. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например, нужна переменная для цикла while. Объявлять внутри цикла - плохая идея, объявлять вне области видимости - тоже такое себе
И можно ограничить область видимости:
C++
1
2
3
4
5
6
7
{
int a;
 
while(...)
{
}
}
Либо через динамическое выделения памяти с помощью new

C++
1
2
3
4
5
int * a = new int;
while(...)
{
 
}
Как лучше?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2021, 05:43
Ответы с готовыми решениями:

Область видимости переменной
Объявляю переменную в блоке(цикл, if) функции main. Как объявить таким образом, чтобы область действия покрывала не только блок, но и...

Область видимости переменной
Пожалуйста проясните новичку почему следующий код выводит сообщение messagebeer вместо message ? ]:->. Я только осваиваю язык поэтому...

Область видимости переменной
Как сделать так,чтобы переменная и ее значение,которое считается в одной функции,было видно во всех других?Просто переменная обнуляется

17
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5208 / 2925 / 1509
Регистрация: 14.12.2018
Сообщений: 5,266
Записей в блоге: 1
31.08.2021, 06:01
Garrysf, лучше первый вариант по-моему, программа будет быстрее чем втрой вариант.
1
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
31.08.2021, 06:27
Переменные с малым sizeof, в стэк, с большим sizeof лучше в кучу. ИМХО.

Добавлено через 2 минуты
Предпочтительней считались динамические переменные.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,998
31.08.2021, 08:05
Лучший ответ Сообщение было отмечено Garrysf как решение

Решение

Garrysf,

C++
1
2
3
4
for(int a=0; условие_продолжения;)
{
   ...
}
Добавлено через 1 минуту
Цитата Сообщение от Garrysf Посмотреть сообщение
Объявлять внутри цикла - плохая идея
это почему? Если нужно - объявляй на здоровье

C++
1
2
3
4
5
6
7
8
while(1)
{
    int a{};
    std::sring s;
    MyBigClass m;
 
    ...
}
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
31.08.2021, 08:52
Цитата Сообщение от Garrysf Посмотреть сообщение
Объявлять внутри цикла - плохая идея, объявлять вне области видимости - тоже такое себе
Цитата Сообщение от Garrysf Посмотреть сообщение
Либо через динамическое выделения памяти с помощью new
Какая здесь связь? Во втором примере a точно так же торчит вне цикла...
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
31.08.2021, 09:10
Цитата Сообщение от Garrysf Посмотреть сообщение
Как лучше?
Как читабельней, компилятор разберется выносить ли переменную за цикл.
0
1 / 1 / 0
Регистрация: 25.08.2021
Сообщений: 92
31.08.2021, 09:34  [ТС]
Croessmah, Алексей1153, если объявлять внутри тела, то оно будет сто раз объявляться/переинициализороваться. А если вынести за цикл и в скобки, то появится автоматическая переменная, которая один раз объявится, один определится и умрет после скобок после цикла
Вместо дополнительных скобок можно new и убить ее после цикла с помощью delete

Хотя точно, в for можно через запятую несколько переменных указать. Яб в жизни не вспомнил эту мелочь
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
31.08.2021, 09:52
Хотя точно, в for можно через запятую несколько переменных указать. Яб в жизни не вспомнил эту мелочь
Это называется переменная цикла, не переменная в цикле.
если объявлять внутри тела, то оно будет сто раз объявляться/переинициализороваться
Рекомендуют нпоборот поступать таким именно образом. С переменными простых типов.
Существует такая штука как оптимизация компилятором.
1
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,998
31.08.2021, 09:57
Цитата Сообщение от Garrysf Посмотреть сообщение
если объявлять внутри тела, то оно будет сто раз объявляться/переинициализороваться
не думай об этом. В большинстве случаев разницы не будет - компилятор обеспечит

разница появится, если в конструкторе объекта будет что-то тяжёлое. Тогда нужно будет учитывать этот момент. В любом случае, сначала нужно доказать, что тормозит именно это место
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
02.09.2021, 11:11
Цитата Сообщение от Garrysf Посмотреть сообщение
если объявлять внутри тела, то оно будет сто раз объявляться/переинициализороваться
Неверно.
Все переменные внутри функции создаются один раз одной инструкцией sub esp, NNN. Компилятор подсчитывает сколько байт занимают все локальные переменные и переменные внутри блоков и просто сдвигает стек на количество байт одной инструкцией процессора. Если вы внутри какого‐то блока объявляете переменную, то она уже заложена в стековый кадр функции, и не создаётся с нуля.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.09.2021, 11:59
Цитата Сообщение от Garrysf Посмотреть сообщение
Как лучше?
1. лучше не использовать new без необходимости.
2. классовые объекты лучше выносить за пределы цикла.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
это почему?
конструкторы/деструкторы могут быть медленными.

в следующем варианте:
C++
1
2
3
4
5
while(!stop)
{
    std::sring s = randValue(); // строка разной длинны
    foo(s);
}
на каждой итерации цикла будут аллоки/деаллоки.

теперь такой вариант:
C++
1
2
3
4
5
6
std::sring s;
while(!stop)
{
    s = randValue(); // строка разной длинны
    foo(s);
}
здесь реаллок будет только в случае нехватки резерва.
и будет амортизирован за несколько итераций.

Добавлено через 3 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
не думай об этом.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
сначала нужно доказать, что тормозит именно это место
у меня 32 ядра, и ничего не тормозит.
но калькулятор жрет так, словно это GTA5.
случайно не ты этот калькулятор делал?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
02.09.2021, 12:04
Цитата Сообщение от hoggy Посмотреть сообщение
в следующем варианте:
C++
1
2
3
4
5
while(!stop)
{
    std::sring s = randValue(); // строка разной длинны
    foo(s);
}
на каждой итерации цикла будут аллоки/деаллоки.

теперь такой вариант:
C++
1
2
3
4
5
6
std::sring s;
while(!stop)
{
    s = randValue(); // строка разной длинны
    foo(s);
}
здесь реаллок будет только в случае нехватки резерва.
и будет амортизирован за несколько итераций.
Каким образом? randValue "по ссылке" возвращает, что ли?
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,998
02.09.2021, 12:04
hoggy, нет
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.09.2021, 12:07
Цитата Сообщение от argcargv Посмотреть сообщение
Каким образом?
чем больше итераций, тем меньше вероятность реаллока.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
02.09.2021, 12:10
hoggy, как randValue выглядит? Ссылку на статический объект возвращает?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.09.2021, 12:12
Цитата Сообщение от argcargv Посмотреть сообщение
покажи randValue.
тебе не нужно видеть что возвращает randValue,
что бы понимать, что второй вариант эффективнее,
чем первый.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.09.2021, 12:35
Цитата Сообщение от hoggy Посмотреть сообщение
тебе не нужно видеть что возвращает randValue,
что бы понимать, что второй вариант эффективнее,
чем первый.
Если оно возвращает std::string, то будет перемещение.
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
02.09.2021, 12:35
argcargv,
Там конструктор будет вызывать..В первом варианте. Каждый раз. Если переменая имеет значение в контексте текущей итерации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2021, 12:35
Помогаю со студенческими работами здесь

Область видимости переменной
#include <iostream> int main() { int i = 5; for(int i = 0; i < 5; i++) { //здесь } return 0;

Область видимости переменной в классе
допустим у меня есть класс A class A { public : ..... std::vector<g *> list; ...... }; и класс наследник class B :...

Область видимости переменной пользовательского класса
Всем привет! Столкнулся с такой проблемой: Создал клас и в нем класс исключений class A { char* pt; public: class...

Область видимости переменной. 3 цикла. Выводим содержимое массива
int main(прошу меня проверить) { Доброго дня, коллеги! Вот сижу с темой - область видимости переменной, нацарапал такое...

Область видимости
Даю фрагмент программы: #include <iostream> #include <stdio.h> #include <cmath> struct elem //тип элемента двусвязного списка ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru