Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Доктор ТуамОсес
Заблокирован
#1

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

14.08.2009, 23:29. Просмотров 1154. Ответов 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 ;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2009, 23:29     Какие конструкции C++ выполняются не там, где написаны?
Посмотрите здесь:

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

Ошибка там где коментарий! - C++
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop ...

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

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

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

Code::Blocks выдаёт ошибку там где её не должно быть - C++
Я решил написать простенькую программу по преобразованию градусов Цельсия в градусы Фаренгейта, а CodeBlocks выдаёт ошибку в строках 11 и...

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

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

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

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

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

Сопоставлять текстовое представление исходного и исполняемого кодов - глупость.
Alexiski
Любитель давать советы
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
22.08.2009, 06:37     Какие конструкции C++ выполняются не там, где написаны? #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:
А про выделение памяти - вопрос не столь глупый, как пытались представить уважаемые товарищи. Это момент выполнения конструктора, что, насколько я помню, достаточно четко привязано к моменту входа в область видимости.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
22.08.2009, 11:44     Какие конструкции C++ выполняются не там, где написаны? #11
По поводу for - читай книжки, там всё написано

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

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

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

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

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

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

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

В цикле где выводится матрица j принимает какие-то странные значения. Почему? - C++
воде все верно, по в цикле где выводится матрица j принимает какие-то странные значения. Почему?#include &lt;iostream&gt; #include &lt;algorithm&gt; ...

Правильно ли написаны выражения - C++
Не нашла подходящую тему, извиняйте есть два вопроса 1.Скажите пожалуйста допустим ли в программе оператор long int с=1&lt;&lt;7; 2.И...


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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
24.08.2009, 18:21     Какие конструкции C++ выполняются не там, где написаны? #14
Какая-то тема очень мутная и непонято о чем.
Если хотите обсуждать конструкторы - создайте новую тему.
Yandex
Объявления
24.08.2009, 18:21     Какие конструкции C++ выполняются не там, где написаны?
Закрытая тема Создать тему
Опции темы

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