Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Доктор ТуамОсес
Заблокирован
#1

Какие конструкции C++ выполняются не там, где написаны? - C++

14.08.2009, 23:29. Просмотров 1194. Ответов 13
Метки нет (Все метки)

Какие конструкции C++ выполняются не там, где написаны?, Я насчитал пока 2 варианта. Подскажите какие есть ещё.
№1.
C++
1
2
3
4
5
6
    for (int i = 0, s = 0; i < 10; i++)
    {
        s += i ;
        // реально оператор i++ из заголовка цикла for
        // выполняется тут, а не в заголовке
    }
№2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int f1 ( int i , int j )
{
    // Реально память под переменную c выделяется тут, а не ниже, где описание
    i++ ;
    j-- ;
    if (i < 7)
    {
        int c ;  // Память под переменную c выделяется не тут, а на входе в ф.-ю
        c = i - j ;
        if (c < 9) goto exit ;
        cout << "error" ;
    }
    return 4 ;
    // -----------------
    exit :
    return 7 ;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2009, 23:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Какие конструкции C++ выполняются не там, где написаны? (C++):

В чём ошибка.В коде там где коментарий там ошибка поучается.
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; class...

Какие три операции выполняются при while(*str++)?
#include &lt;stdio.h&gt; using namespace std; int strLength(const char* str){ ...

Ошибка там где коментарий!
{int i,j,o,c,max=-100,min=100,l,p,swap,k; for(i=0;i&lt;N;i++) {o=0;...

Ошибка там где коментарий!
//--------------------------------------------------------------------------- ...

Ошибка там где коментарий!
{int i,j,swap,g,h,min=100,max=-100,q,w,e,r,c,v; for(i=0;i&lt;N;i++)...

Игра пинг-понг: отрисовка происходит там, где не должна
Написал отрисовку кадра в консоль и управление объектами. Начал тестировать...

13
CheshireCat
Эксперт С++
2907 / 1256 / 114
Регистрация: 27.05.2008
Сообщений: 3,451
14.08.2009, 23:47 #2
По №1 - читай Стандарт, 6.5.3/1, там абсолютно четко все описано. Не вижу в твоем постинге никаких противоречий требованиям Стандарта.
По №2 - зависит от компилятора. Стандарт не устанавливает никаких требований к моменту выделения памяти под локальную переменную. Таким образом, описанное тобою поведение компилятора никоим образом не противоречит требованиям Стандарта. Мне приходилось встречаться с разными компиляторами, и, уверяю тебя, момент выделения памяти под переменную с сильно зависит как от конкретного компилятора, так и от типа сборки (дебаг/релиз) и от ключей оптимизации компилятора.

Ну и что? При чем здесь "где написаны" конструкции?
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
15.08.2009, 00:12 #3
понимаю, каждому хочется открыть свою планету. но неоткрытые - далеко или очень далеко.

"реально оператор i++ из заголовка цикла for"... выполняется между двумя плюсами после i

"// Реально память под переменную c выделяется тут, "... а точнее - между двумя косыми комментария.
0
Доктор ТуамОсес
Заблокирован
15.08.2009, 00:21  [ТС] #4
Цитата Сообщение от CheshireCat Посмотреть сообщение
Не вижу в твоем постинге никаких противоречий требованиям Стандарта.
Цитата Сообщение от CheshireCat Посмотреть сообщение
Таким образом, описанное тобою поведение компилятора никоим образом не противоречит требованиям Стандарта.
А я разве говорил, что о противоречиях стандарту?
Прочитайте внимательней название темы.

Добавлено через 1 минуту 57 секунд
Цитата Сообщение от novi4ok Посмотреть сообщение
понимаю, каждому хочется открыть свою планету. но неоткрытые - далеко или очень далеко.
Причём тут "планеты"?
Я задал конкретный вопрос и огласил свою просьбу.
0
Monte-Cristo
2794 / 1380 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.08.2009, 00:43 #5
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
А я разве говорил, что о противоречиях стандарту?
Прочитайте внимательней название темы.
тебе сказали, что определить заведомо где произодйет выделение под память нельзя. все зависит от компилятора, и кокретного балда (дебаг может в разных местах создавать перменную).
0
Доктор ТуамОсес
Заблокирован
15.08.2009, 00:48  [ТС] #6
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
тебе сказали, что определить заведомо где произодйет выделение под память нельзя. все зависит от компилятора, и кокретного балда (дебаг может в разных местах создавать перменную).
Ну а что скажете по примеру №1?
0
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 921
15.08.2009, 01:19 #7
По примеру 1 могу сказать,что сначала выполняется тело цикла,и сразу после него инкремент.Конкретно в инструкции for так.А по второму не тут и там,а важно,как работает компилятор.Может быть сначала проверяется синтаксис и резервируются переменные,а то что уже видишь ты-это выполнение уже после резервирования переменных.Это надо конкретно смотреть исходники компилятора или читать доку,как там точно всё.Интересно,с чего ты сделал такой вывод,что память резервируется "там,а не там"?
0
Доктор ТуамОсес
Заблокирован
22.08.2009, 02:51  [ТС] #8
Цитата Сообщение от #pragma Посмотреть сообщение
Интересно,с чего ты сделал такой вывод,что память резервируется "там,а не там"?
Из того, что существует оператор goto в одно точку программы
0
skvor
640KB мне хватило на всё.
118 / 49 / 3
Регистрация: 07.06.2009
Сообщений: 442
22.08.2009, 03:26 #9
Вообще-то все операторы написаны на моём мониторе, а выполняются в процессоре (и кажется не моего компутера).

Сопоставлять текстовое представление исходного и исполняемого кодов - глупость.
0
Alexiski
Любитель давать советы
341 / 133 / 14
Регистрация: 12.01.2009
Сообщений: 511
22.08.2009, 06:37 #10
Лично я встречал такую реализацию:
Assembler
1
2
3
4
5
6
7
8
9
10
     xor     dx, dx
     jmp    @2
@1:
     inc     dx
@2:
     cmp     dx, [...]
     jnl     @3
...
     jmp     @1
@3:
А про выделение памяти - вопрос не столь глупый, как пытались представить уважаемые товарищи. Это момент выполнения конструктора, что, насколько я помню, достаточно четко привязано к моменту входа в область видимости.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,441
Записей в блоге: 30
22.08.2009, 11:44 #11
По поводу for - читай книжки, там всё написано

По поводу выделения памяти - в момент вхоа в процедуру сразу выделяется регистровое окно для ВСЕХ переменных процедуры (независимо от того, на каком уровне вложенности описана переменная). Теоретически старые компиляторы могли заниматься расширением стека на каждый новый лексический блок, но современные с вероятностью 99.99% всю _статически_ известную стековую память выделяют при входе в процедуру (массив с переменным числом аргументов НЕ относится к этому случаю). Т.е. автор по сути дела правильно написал мысль "Реально память под переменнЫЕ c выделяется тут, а не ниже, где описание" но выразил её слишком коряво

Alexiski, конструктор НЕ занимается выделением памяти. Контсруктор занимается ТОЛЬКО инициализацией полей
0
Alexiski
Любитель давать советы
341 / 133 / 14
Регистрация: 12.01.2009
Сообщений: 511
23.08.2009, 22:13 #12
Цитата Сообщение от Evg Посмотреть сообщение
современные с вероятностью 99.99% всю _статически_ известную стековую память выделяют при входе в процедуру (массив с переменным числом аргументов НЕ относится к этому случаю).
Массив с переменным числом аргументов в стековой памяти? Вы ничего не путаете?
Upd. Понял, вероятно Вы имеете ввиду массивы из вложенных блоков.

Цитата Сообщение от Evg Посмотреть сообщение
Т.е. автор по сути дела правильно написал мысль "Реально память под переменнЫЕ c выделяется тут, а не ниже, где описание" но выразил её слишком коряво
Собственно, и я об этом же, только другими словами, разве нет?

Цитата Сообщение от Evg Посмотреть сообщение
Alexiski, конструктор НЕ занимается выделением памяти. Контсруктор занимается ТОЛЬКО инициализацией полей
Конструктор НЕ занимается выделением памяти, согласен Конструктор занимается ТОЛЬКО инициализацией полей ПОСЛЕ выделения памяти. Следовательно, на момент вызова конструктора память должна быть УЖЕ выделена. Таким образом, фиксация момента вызова конструктора задает одну из границ диапазона, в котором компилятор обязан выделить память. Что я и пытался написать. Но мне показалось, что весь этот ход рассуждения достаточно очевиден, и его не обязательно приводить столь подробно..
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,441
Записей в блоге: 30
23.08.2009, 22:42 #13
Цитата Сообщение от Alexiski Посмотреть сообщение
Массив с переменным числом аргументов в стековой памяти? Вы ничего не путаете?
Upd. Понял, вероятно Вы имеете ввиду массивы из вложенных блоков.
Имелл виду конструкции вида "int a[n];", где n - переменная

Цитата Сообщение от Alexiski Посмотреть сообщение
Собственно, и я об этом же, только другими словами, разве нет?
Цитата Сообщение от Alexiski Посмотреть сообщение
Конструктор НЕ занимается выделением памяти, согласен Конструктор занимается ТОЛЬКО инициализацией полей ПОСЛЕ выделения памяти. Следовательно, на момент вызова конструктора память должна быть УЖЕ выделена. Таким образом, фиксация момента вызова конструктора задает одну из границ диапазона, в котором компилятор обязан выделить память. Что я и пытался написать. Но мне показалось, что весь этот ход рассуждения достаточно очевиден, и его не обязательно приводить столь подробно..
Сложно понять, что ты имел ввиду
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
24.08.2009, 18:21 #14
Какая-то тема очень мутная и непонято о чем.
Если хотите обсуждать конструкторы - создайте новую тему.
0
24.08.2009, 18:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2009, 18:21
Привет! Вот еще темы с решениями:

Code::Blocks выдаёт ошибку там где её не должно быть
Я решил написать простенькую программу по преобразованию градусов Цельсия в...

Исправить в тексте множественное число существительных на единственное там, где это необходимо
Входной файл: input.txt Выходной: output.txt Лимит времени: 10 сек. Ни для...

Как сделать так, чтобы программа открывалась там, где я её закрыл в прошлый раз?
Как переделать эту функцию: main_hWnd = CreateWindowEx( WS_EX_TOPMOST,...

такая проблема: дома 2 компъютера , один с Windows Vista, другой с Windows XP. Там, где Vista - интернет работает как часы, а там, где ХР - интернета
Здравствуйте, у меня такая проблема: дома 2 компъютера , один с Windows Vista,...


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

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

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