Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
1

Действия в глобальной области

15.08.2019, 13:00. Показов 1534. Ответов 23
Метки нет (Все метки)

Здравствуйте!
Скажите, пожалуйста, почему в глобальной области нельзя работать также, как в локальной (в той же функции main)?
Уточняю.

1) Почему нельзя сначала определить глобальную переменную, а инициализировать её уже на следующей строчке (инициализировать получается либо сразу при определении, либо внутри другой функции)?

2) Почему, если определить какую-либо пользовательскую функцию, то нельзя сразу же после этого её вызвать (вызвать получается либо при инициализации глобальной переменной, либо внутри другой функции)? Почему, когда я так делаю, Visual Studio начинает думать, что это не вызов функции, а ещё одно её объявление, но без типа?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2019, 13:00
Ответы с готовыми решениями:

Видимость констант из глобальной области внутри класса
#include <iostream> //stack struct struct node; struct node { int* val; node* prev;...

Увеличение значения переменной, обявленной в глобальной области
Начал изучать CUDA, т. к. надо пистаь курсач... И вот у меня появился вопрос. Допустим я выделил в...

Области действия переменной
void f() { ... // 1 { ... // 2 int i; for(i=0; i<10; ++i) { ......

Различие глобальной и глобальной статической переменной
у нас есть заголовочный файл со стражами, допустим global.h , его используют несколько других...

23
278 / 250 / 209
Регистрация: 14.11.2016
Сообщений: 948
15.08.2019, 18:24 2
Начни с понятий.
Цитата Сообщение от Марауль Посмотреть сообщение
1) Почему нельзя сначала определить глобальную переменную, а инициализировать её уже на следующей строчке (инициализировать получается либо сразу при определении, либо внутри другой функции)?
Таков синтаксис.
Цитата Сообщение от Марауль Посмотреть сообщение
2) Почему, если определить какую-либо пользовательскую функцию, то нельзя сразу же после этого её вызвать (вызвать получается либо при инициализации глобальной переменной, либо внутри другой функции)? Почему, когда я так делаю, Visual Studio начинает думать, что это не вызов функции, а ещё одно её объявление, но без типа?
Функция - фрагмент кода или алгоритм, реализованный на каком-либо ЯП, с целью выполнения определенных последовательных операций. Где хотим там и юзаем. НО! Либо для инициализации переменной до точки входа, либо с начала точки входа в программу там где захочешь. Таков синтаксис.

Добавлено через 8 минут
До main глобальная переменная может быть объявлена, либо объявлена и инициализирована. Если пожелаешь инициализировать глобальную переменную после объявления в глобальной области, то ее название будет воспринято как тип данных.
+ по твоей логике какой бы был смысл от такого кода...
C++
1
2
3
4
5
6
7
8
9
// ...
int x;
x = 10;
x = 20;
x = 30;
 
// ...
 
int main(){ /*...*/ }
1
зомбяк
1531 / 1176 / 332
Регистрация: 14.05.2017
Сообщений: 3,815
15.08.2019, 18:27 3
Цитата Сообщение от Марауль Посмотреть сообщение
либо внутри другой функции
Внутри функции глобальная переменная не инициализируется, а присваивает новое значение.
Цитата Сообщение от Марауль Посмотреть сообщение
то нельзя сразу же после этого её вызвать
Потому что во всей программе есть единственная функция, которая запускается изначально - int main() или её аналоги (в зависимости от компилятора и среды). И всё остальное может происходить только исходя из кода в ней (хотя и существуют исключения, но очень редко используемые).
1
11 / 7 / 4
Регистрация: 25.03.2019
Сообщений: 140
15.08.2019, 18:28 4
Лучший ответ Сообщение было отмечено Марауль как решение

Решение

Для работы с переменными и функциями как раз и нужны сами функции. Если бы это можно было бы делать вот так, просто, где хочешь, то функции main() и не существовало бы. Она бы не была нужна. Все пространство вне функций - космос, а функции - космические станции, выполняющие свои задачи, глоб. переменные можешь считать мусором или выбравшимся из станции астронавтом. А для обычного вызова, или работы с переменными без всяких дополнительных функций есть функция main(). Как думаешь, почему все функции видят только переменные, которые объявлены глобально, но не те, что в других функциях? Тогда произошёл бы хаос. Тут и проблема с доступом будет. Представь себе ситуацию: ты пишешь код, имеющий много функций и переменных, при этом работаешь в глобальном режиме как и в функции main() или других ф., вызываешь там функции, присваиваешь значения переменным и т.д.. А теперь представь, что произойдёт, когда ты эту прогу запустишь? Программа попросту не будет знать, что ей делать сначала, что потом, другими словами - в какой последовательности?! Вот вызвал ты функцию из мейна, она выполнилась, а после этого, следуя твоей логике, должно выполниться не то, что в функции main() после вызова той самой функции, а то, что идёт сразу же, после определения функции, а именно - её вызов. Как ты в уточнении сказал «объявить функцию, а потом сразу же её вызвать». Вот и все, это общепризнанная логика работы всех языков программирования, и она прекрасна).
1
зомбяк
1531 / 1176 / 332
Регистрация: 14.05.2017
Сообщений: 3,815
15.08.2019, 18:32 5
Darkfor, такое не свойственно декларативным языкам программирования. А вот для императивного языка С++ только так.
1
2718 / 1883 / 558
Регистрация: 05.06.2014
Сообщений: 5,489
16.08.2019, 06:18 6
Цитата Сообщение от Марауль Посмотреть сообщение
Скажите, пожалуйста, почему в глобальной области нельзя работать также, как в локальной (в той же функции main)?
Потому что этот синтаксис придумывали в те допотопные времена, когда даже int x=0 делать было нельзя. Го в Питон, там все что вы описали можно. Правда, там и main нету.
Цитата Сообщение от Darkfor Посмотреть сообщение
Как думаешь, почему все функции видят только переменные, которые объявлены глобально, но не те, что в других функциях?
Потому что локальные переменные имеют auto storage и не существуют до момента вызова соответствующей функции. А про static никто как то не подумал.
Цитата Сообщение от Darkfor Посмотреть сообщение
А теперь представь, что произойдёт, когда ты эту прогу запустишь?
Восклицание "Вах! Конструктор глобальной переменной запустился!". Давно уже можно всунуть свой код до вызова main. Через хак "сунь в конструктор глобальной переменной", но можно. Возможно что и правда логичнее было бы делать это Питон-стайл. Но синтаксис сейчас никто уже на столько радикально менять не будет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Test
{
public:
    Test(){std::cout<<"Before main"<<std::endl;}//сработает до main
};
Test test;
 
int main()
{
    std::cout<<"After main"<<std::endl;//сработает внутри main
    return 0;
}
1
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
16.08.2019, 08:55 7
Цитата Сообщение от Renji Посмотреть сообщение
Восклицание "Вах! Конструктор глобальной переменной запустился!". Давно уже можно всунуть свой код до вызова main. Через хак "сунь в конструктор глобальной переменной", но можно. Возможно что и правда логичнее было бы делать это Питон-стайл. Но синтаксис сейчас никто уже на столько радикально менять не будет.
Ну, это ты относительно main показал. А как насчёт других глобальных переменных? В каком порядке они будут проинициализированы и в каком порядке выполнятся твои "хаки"? По-моему, этот порядок не определён.
Так что, думаю, этот питон-стайл здесь не проканает никак.
2
2718 / 1883 / 558
Регистрация: 05.06.2014
Сообщений: 5,489
16.08.2019, 09:26 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну, это ты относительно main показал. А как насчёт других глобальных переменных? В каком порядке они будут проинициализированы и в каком порядке выполнятся твои "хаки"? По-моему, этот порядок не определён.
В каком порядке объявлялись, в таком и будут. Как иначе по вашему передавать одну глобальную переменную в конструктор другой?
C++
1
2
3
//прежде чем инициализируется inputFile, должен инициализироваться path
std::string path="input.txt";
std::ifstream inputFile(path);
Разумеется, это все в пределах одной единицы трансляции. Сами единицы могут идти в произвольном порядке.
1
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
16.08.2019, 10:03 9
Цитата Сообщение от Марауль Посмотреть сообщение
Скажите, пожалуйста, почему в глобальной области нельзя работать также, как в локальной (в той же функции main)?
Потому что так устроен язык С++.
2
Комп_Оратор)
Эксперт по математике/физике
8719 / 4425 / 598
Регистрация: 04.12.2011
Сообщений: 13,256
Записей в блоге: 16
16.08.2019, 12:21 10
Цитата Сообщение от Марауль Посмотреть сообщение
Скажите, пожалуйста, почему в глобальной области нельзя работать также, как в локальной (в той же функции main)?
Почему нельзя сначала определить глобальную переменную, а инициализировать её уже на следующей строчке (инициализировать получается либо сразу при определении, либо внутри другой функции)?
А разве в локальной области можно сначала определить , а потом инициализировать?
1
5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
16.08.2019, 17:03  [ТС] 11
Darkfor, спасибо большое за развёрнутый ответ с приятной аналогией! Груз моего вопроса стал намного легче!
anapshy, TRam_, Renji, oleg-m1973, TheCalligrapher, спасибо вам большое за ответы! Сложив из них пазл, я всё более-менее нормально понял.

IGPIGP, конечно да! Ведь определение - это объявление + выделение памяти, а инициализация - это присвоение конкретного значения программистом или пользователем. Хоть при определении той же переменной ей и присваивается компилятором какое-то случайное значение, этот процесс формально не считается инициализацией.
0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
16.08.2019, 17:07 12
Цитата Сообщение от Марауль Посмотреть сообщение
а инициализация - это присвоение конкретного значения программистом или пользователем
инициализация - это присвоение конкретного значения программистом во время определения.
1
5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
16.08.2019, 17:50  [ТС] 13
_stanislav, да, действительно, во время определения какой-нибудь переменной можно инициализировать её каким-то конкретным значением. Но инициализация необязательно должна проходить именно в этот момент.
0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
16.08.2019, 18:25 14
Марауль, я вижу это так, как только переменная определенна, она обязательно должна быть инициализирована, хоть каким то значением и не важно в какой момент это происходит, в конструкторе или оператором присваивания или не определенным значением, инициализация всегда имеет место при определении.

Добавлено через 3 минуты
а, присваивание, это уже когда объекту присваивается новое значение, то есть старое значение полученное при инициализации и определения затирается.
0
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
16.08.2019, 19:06 15
Цитата Сообщение от Марауль Посмотреть сообщение
да, действительно, во время определения какой-нибудь переменной можно инициализировать её каким-то конкретным значением. Но инициализация необязательно должна проходить именно в этот момент
В формальной терминологии языка С++, и инициализация делается только в момент объявления. Все остальное - это уже не инициализация.
1
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
16.08.2019, 19:08 16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в момент объявления
имелось ввиду определения?
0
зомбяк
1531 / 1176 / 332
Регистрация: 14.05.2017
Сообщений: 3,815
16.08.2019, 19:14 17
Цитата Сообщение от _stanislav Посмотреть сообщение
инициализация всегда имеет место при определении
Не всегда. Например при использовании
C++
1
extern int a;
когда a инициализируется в иной единице трансляции, а в этой только определяется.
1
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
16.08.2019, 19:17 18
Цитата Сообщение от TRam_ Посмотреть сообщение
а в этой только определяется
имелось ввиду объявляется?
0
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
16.08.2019, 19:25 19
Цитата Сообщение от _stanislav Посмотреть сообщение
имелось ввиду определения?
Объявление с инициализатором всегда будет определением, разумеется. Но уточнять это необходимости нет. В терминологии С и С++ обычно всегда используется термин объявление, за исключением тех случаев, когда критически возможны неоднозначности.
2
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
16.08.2019, 19:29 20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
когда критически возможны неоднозначности
сейчас критически не возможны неоднозначности? когда примерно такие критические моменты наступают?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2019, 19:29

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Указатель this и операция разрешения области действия
Помогите, пожалуйста..возник вопрос при наследовании классов Вот фрагмент кода, конструктор...

Считать цвет определенной области и выполнить определенные действия, в зависимости от цвета
Смотрите, возможно ли сделать так что бы программа считывала в онлайн режиме цвета в определенной...

Ошибка вызова конструктора преобразования с аргументом - переменной в области действия данной переменной
Всем доброго времени суток. Увидел на англоязычном сайте школярский вопросик, который может...

Инициализация глобальной переменной
Здравствуйте, мне необходимо в программе по решению СНАУ добавить возможность задавать коэфициенты...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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