Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204

Что разрешено в глобальном пространстве?

12.01.2019, 00:34. Показов 1520. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
One unusual feature of C++ (and C) is that you can use the assignment operator serially. For example, the following is valid code:
C++
1
2
3
4
int steinway;
int baldwin;
int yamaha;
yamaha = baldwin = steinway = 88;
Стивен Прата информирует, что этот его пример — это пример валидного кода. Однако тут есть два момента: конкретно этот обрывок кода сам по себе не скомпилируется, функция main в нём не определена. Он не скомпилируется даже в том случае, если приписать к нему пустое определение функции main. Проверим:
C++
1
2
3
4
5
6
7
8
9
int steinway;
int baldwin;
int yamaha;
yamaha = baldwin = steinway = 88;
 
int main()
{
 
}
Результат:
main.cpp:4:1: error: 'yamaha' does not name a type

yamaha = baldwin = steinway = 88;

^~~~~~
Почему так происходит? Я предполагаю, что в глобальном пространстве запрещено присваивание, разрешена только инициализация. Верно ли это предположение?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2019, 00:34
Ответы с готовыми решениями:

Вызов функции в глобальном пространстве
Подскажите какой пункт стандарта запрещает вызов функций и написания различного кода в глобальном пространстве программы?

Как посмотреть при отладке что в глобальном массиве
Работаю в QTCreator. Консольный проект Qt. Создаю глобальный массив, заполняю его данными и произвожу над ними различные математические...

Найти координаты точки в пространстве, имея уравнение прямой в пространстве
Имеются две точки, через которые проходит прямая в пространстве: A(3; 1; 4216) B(12; 10; 12308) Найти z координату точки, лежащей...

14
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
12.01.2019, 00:55
Помести этот код в main.

Добавлено через 1 минуту
Цитата Сообщение от Jzx Посмотреть сообщение
Стивен Прата информирует, что этот его пример — это пример валидного кода.
Он не имеет в виду, что это код в вакууме без окружающего его кода. Это просто кусок для демонстрации.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.01.2019, 01:26
Цитата Сообщение от Jzx Посмотреть сообщение
Я предполагаю, что в глобальном пространстве запрещено присваивание, разрешена только инициализация. Верно ли это предположение?
Ну и в дополнение, нет не верно. Глобальные переменные инициализируются в порядке определения, а не объявления. Размещенный вами код не работает, потому что yamaha не объявлен в момент определения, по идее компилятор попытается интерпритировать yamaha как int yamaha = ..., что еще вызовет и ошибки переопределения одной и той же переменной.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
12.01.2019, 02:34  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
не объявлен в момент определения
Но так ведь не бывает?
Цитата Сообщение от Azazel-San Посмотреть сообщение
по идее компилятор попытается интерпритировать yamaha как int yamaha = ...,
С чего вдруг? Почему так?

Добавлено через 4 минуты
Цитата Сообщение от krolligator Посмотреть сообщение
Он не имеет в виду, что это код в вакууме без окружающего его кода. Это просто кусок для демонстрации.
Поэтому приходится гадать, какой должен быть контекст.

Добавлено через 24 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
Глобальные переменные инициализируются в порядке определения, а не объявления.
Вот интересный вопрос: а где об этом написано хоть полслова в стандарте языка? Я искал, но не нашел.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
12.01.2019, 09:46
Jzx,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int a;
int b;
int c;
c = b = a = 88; // не работает
 
int main()
{
    int a1;
    int b1;
    int c1;
    c1 = b1 = a1 = 88; // работает
 
    return 0;
}
я думаю что это не компилируется потому что в конструкции c = b = a = 88; компилятор должен создать какой то рабочий код, а рабочий код может быть создан только в теле функции. сформулировал плохо, поправьте.
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
12.01.2019, 12:50
Учитывая, что вне тела функции допустимы объявления и определения (возможно с инициализацией переменных), можно ухитриться написать такой рабочий код. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int add(int x, int y) {
    return x + y;
}
 
auto &t1 = (cout << "Calculator!" << endl);
int x;
auto &t2 = (cout << "Enter x: ");
auto &t3 = (cin >> x);
int y;
auto &t4 = (cout << "Enter y: ");
auto &t5 = (cin >> y);
int sum = add(x, y);
auto &t6 = (cout << "x + y = " << sum << endl);
 
int main() {
    return 0;
}
Без выполнения первого условия (наличие объявления или определения) писать команды наверное не получится. Если изменить код из первого поста, он станет рабочим.
C++
1
2
3
4
5
6
7
8
int steinway;
int baldwin;
int yamaha = baldwin = steinway = 88;
 
int main()
{
 
}
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.01.2019, 14:41
Цитата Сообщение от Jzx Посмотреть сообщение
Но так ведь не бывает?

Цитата Сообщение от Jzx Посмотреть сообщение
С чего вдруг? Почему так?
имеем код:
C++
1
2
3
int a;
a = 5;
int main() {}
Студия выдает такие ошибки:
source_file.cpp(2): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
source_file.cpp(2): error C2086: 'int a': redefinition
source_file.cpp(1): note: see declaration of 'a'
Хотя это скорее поведение компилятора, gcc тоже выдает такое?
Цитата Сообщение от Jzx Посмотреть сообщение
Поэтому приходится гадать, какой должен быть контекст.
Это элементарные вещи..
Цитата Сообщение от Jzx Посмотреть сообщение
Вот интересный вопрос: а где об этом написано хоть полслова в стандарте языка? Я искал, но не нашел.
Вы не смогли скомпилировать код данный в книжке для новичков, а стандарт собственно хоть нашли?
6.6.3 Dynamic initialization of non-local variables [basic.start.dynamic]
  1. Dynamic initialization of a non-local variable with static storage duration is unordered if the variable is an implicitly or explicitly instantiated specialization, is partially-ordered if the variable is an inline variable that is not an implicitly or explicitly instantiated specialization, and otherwise is ordered. [ Note: An explicitly specialized non-inline static data member or variable template specialization has ordered initialization. — end note ]
  2. Dynamic initialization of non-local variables V and W with static storage duration are ordered as follows:
    • If V and W have ordered initialization and V is defined before W within a single translation unit, the initialization of V is sequenced before the initialization of W.
    • If V has partially-ordered initialization, W does not have unordered initialization, and V is defined before W in every translation unit in which W is defined, then
      • if the program starts a thread (4.7) other than the main thread (6.6.1), the initialization of V strongly happens before the initialization of W;
      • otherwise, the initialization of V is sequenced before the initialization of W.
    • Otherwise, if the program starts a thread other than the main thread before either V or W is initialized, it is unspecified in which threads the initializations of V and W occur; the initializations are unsequenced if they occur in the same thread.
    • Otherwise, the initializations of V and W are indeterminately sequenced.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
12.01.2019, 15:50  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Хотя это скорее поведение компилятора, gcc тоже выдает такое?
А, ну тут всё понятно. Визуальная студия пользуется устаревшим “implicit int” rule заимствованным из языка C: при отсутствии имени типа по умолчанию подставляется тип int. Как следствие, строчка a = 5; читается как int a = 5;, из-за этого у вас возникает redefinition. Современный GCC ведёт себя умнее и в соответствии с современными стандартами, из которых “implicit int” rule заслуженно выброшено на помойку. Как именно — проверьте сами.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Вы не смогли скомпилировать код данный в книжке для новичков, а стандарт собственно хоть нашли?
Давайте для начала посмотрим на приведённые примеры кода. Потом на вашу цитату из стандарта. Потом снова на примеры. Где вы в этом коде обнаружили динамическую инициализацию? Она тут есть?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.01.2019, 16:16
Цитата Сообщение от Jzx Посмотреть сообщение
на приведённые примеры кода
они были приведены для представления ошибки о redefinition.
Цитата Сообщение от Jzx Посмотреть сообщение
цитату из стандарта
а она приведена к вашему вопросу, вы же найти не смогли
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
12.01.2019, 16:35
Лучший ответ Сообщение было отмечено Jzx как решение

Решение

Цитата Сообщение от Jzx Посмотреть сообщение
Я предполагаю, что в глобальном пространстве запрещено присваивание, разрешена только инициализация. Верно ли это предположение?
Не только присваивание, а вообще любые выражения, не являющиеся частью выражения инициализации или частью объявления.
И, собственно, это так не только в глобальном, но и в любом другом scope не являющимся функцией или блоком.

Добавлено через 6 минут
Цитата Сообщение от Azazel-San Посмотреть сообщение
Глобальные переменные инициализируются в порядке определения, а не объявления.
Вы немножко напутали.
В его случае нет отдельных определений. Выражения присваивания не являются определениями, но, напротив, его объявления также являются и определениями, т.к. были указаны без ключевого слова extern.

9|11
Syntactic components beyond those found in the general form of declaration are added to a function declaration to make a function-definition.
An object declaration, however, is also a definition unless it contains the extern specifier and has no initializer ([basic.def]).
A definition causes the appropriate amount of storage to be reserved and any appropriate initialization ([dcl.init]) to be done.
1
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
12.01.2019, 16:37  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
они были приведены для представления ошибки о redefinition.
Эта "ошибка" возникла у вас в VS. И видимо эта VS очень древняя. Но меня это по большому счёту не волнует, ибо непосредственно к языку ваши "ошибки" не относятся вообще никак.
Цитата Сообщение от Azazel-San Посмотреть сообщение
а она приведена к вашему вопросу, вы же найти не смогли
Повторяю вопрос: где вы нашли динамическую инициализацию? Приведите ту часть кода, в которой вы её обнаружили.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы немножко напутали.
В его случае нет отдельных определений. Выражения присваивания не являются определениями, но, напротив, его объявления также являются и определениями, т.к. были указаны без ключевого слова extern.
А он не напутал: он не понимает.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.01.2019, 16:47
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы немножко напутали.
Напутал, но не именно в этой фразе, а дальше)
А именно эта фраза была сказана в отрыве от кодa.
Цитата Сообщение от Jzx Посмотреть сообщение
И видимо эта VS очень древняя.
Нет, сама свежая.
Цитата Сообщение от Jzx Посмотреть сообщение
Приведите ту часть кода, в которой вы её обнаружили.
C++
1
2
int a() { return 10; }
int const b = a();
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
12.01.2019, 17:12  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
C++
1
2
int a() { return 10; }
int const b = a();
Знаете что, пришло время мне с вами прощаться. Неквалифицированная помощь — дело простительное, если сопровождается искренним желанием помочь. Но такой троллинг — это уже слишком.

Я уже отправил одного тролля с таким же низким уровнем знаний в игнор-лист. Поэтому вам, Azazel-San, там будет вместе с ним нескучно. Думаю, вы там легко между собой найдёте общий язык (но это будет не С++, потому что в С++ вы оба совершенно беспомощны).
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
12.01.2019, 17:45
Цитата Сообщение от Jzx Посмотреть сообщение
конкретно этот обрывок кода сам по себе не скомпилируется
Это нормально. Такие примеры даются в расчете на базовую подготовку. Предполагается, что человек сам дополнит контекст, в котором это применимо. Потому что развернутые примеры писать на каждый чих - это значит сильно раздувать книгу. Иногда поступают иначе, и дают полные примеры в качестве доп. материалов к книге, на диске или на сайте. Но у переводов актуальная информация по этому вопросу зачастую быстро утрачивается (диска с книгой нет, а ссылки на сайт русского издательства быстро устаревают).
В любом случае вам нужно быть морально готовым, что примеры, которые вам дают (не только в нигах, но и здесь, например, на форуме) не имеет всего необходимого для компиляции, а лишь отражают некую идею, в расчете на ваши базовые знания. Осуждать авторов за это не стоит.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
12.01.2019, 17:53  [ТС]
DrOffset, да нормально в принципе. Просто из этого примера возник вопрос.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2019, 17:53
Помогаю со студенческими работами здесь

Ошибка при глобальном хуке
Есть библиотека - https://code.google.com/p/klog-sharp/source/browse/trunk/Keylogger/UserActivityHook.cs?r=2 Инициализирую так: ...

Поймать исключение в глобальном объекте
Есть глобальный объект, конструктор которого может кинуть исключение типа std::exception. Разумеется, на этом приключения программы и...

Доказать, что многочлены образуют базис в пространстве многочленов
Доказать, что многочлены 2t+{t}^{5}, {t}^{3}-{t}^{5}, t+{t}^{3} образуют базис в пространстве нечётных многочленов степени не выше 5, и...

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

Доказать, что в евклидовом пространстве операция суммы непрерывна
Как это следует из неравенства Коши-Буняковского?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru