С++ и другие

Assembler, Basic, Pascal/Delphi, Perl, PHP, JavaScript, HTML и т.д. Вопросы и помощь.

С++ и другие

Непрочитанное сообщение Anri » 26 ноя 2008, 23:00:15

snb писал(а):
Alex ilmarranen писал(а):2snb Чё та да… не предположилъ наличия такой возможности… %)


А ведь это гораздо проще, чем ломать голову над явно искусственным примером! Вот он, вопрос применения IT-технологий в зависимости от реальной необходимости! *HOHO*
Шутю, не обижайся.


так не шутка. смысл вопросы и родился из именно прочтения "чему нас учат" и тд и тп ;)
snb писал(а):Мой моцк опух… Это у тебя еще день, а мне пора рюмку и в койку. Пойду так и сделаю… Ауфвидерзейн!


аналогично.
я тоже пойду. было приятно, что у нас такая крепкая дискуссия завелась.
давно тут не опчалися с удовольствием
Давай с тобой поговорим, прости, не знаю, как зовут.
Но открывается другим, все то, что близким берегут.
Ты скажешь: "Все наоборот, согласно логике вещей",
Но это редкий поворот, а, может, нет его вообще.

(с) О.Митяев
Anri
Магистр
Магистр
 
Сообщения: 2137
Зарегистрирован: 05 июл 2006, 23:30:06
Откуда: Frankfurt am Main, Germany
Пол: Мужской

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 26 ноя 2008, 23:05:39

PV писал(а):Не верю что включил.
:D Могу видео снять?
Хатити?

2snb А я и не пишу… Я помнилъ вотъ до сего дня, что какая-то неприятность съ этимъ есть… Если что - нашёлъ бы что конкретно… А вы говорите книииижки не читать… Между прочимъ въ примечанияхъ именно этотъ(и надо сказать ещё масса другихъ такихъ) нюансъ содержался… :) Съ книжкой по СPP мне повезло скаааазачно :)
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение Anri » 26 ноя 2008, 23:10:06

Alex ilmarranen писал(а):
PV писал(а):Не верю что включил.
:D Могу видео снять?
Хатити?


он - омериканец. ему, как грузину, видево - не доказательство. пускай остайоццо правым. потому - он ещё и русскийю а этот коктейль не переубедить.
Давай с тобой поговорим, прости, не знаю, как зовут.
Но открывается другим, все то, что близким берегут.
Ты скажешь: "Все наоборот, согласно логике вещей",
Но это редкий поворот, а, может, нет его вообще.

(с) О.Митяев
Anri
Магистр
Магистр
 
Сообщения: 2137
Зарегистрирован: 05 июл 2006, 23:30:06
Откуда: Frankfurt am Main, Germany
Пол: Мужской

С++ и другие

Непрочитанное сообщение Гость » 27 ноя 2008, 03:36:56

Alex ilmarranen писал(а):
PV писал(а):Не верю что включил.
:D Могу видео снять?
Хатити?


Скриншота с логом компилятора достаточно.
Anri писал(а):
Alex ilmarranen писал(а):
PV писал(а):Не верю что включил.
:D Могу видео снять?
Хатити?


он - омериканец. ему, как грузину, видево - не доказательство. пускай остайоццо правым. потому - он ещё и русскийю а этот коктейль не переубедить.


Вот что компилирует Visual C++ 2005 с оптимизацией:
Код: Выделить всё
; 5    :    int a = 5;
; 6    :    a = ++a + ++a;
; 7    :    printf("%dn", a);

   push   14               ; 0000000eH
   push   OFFSET ??_C@_03PMGGPEJJ@?CFd?6?AA@
   call   DWORD PTR __imp__printf


2-я строчка асма - это запихивание адреса форматной строчки ("%dn"). А так - все так, как я предполагал в самом начеле.
Для сравнения - без оптимизации:
Код: Выделить всё
; 5    :    int a = 5;

   mov   DWORD PTR _a[ebp], 5

; 6    :    a = ++a + ++a;

   mov   eax, DWORD PTR _a[ebp]
   add   eax, 1
   mov   DWORD PTR _a[ebp], eax
   mov   ecx, DWORD PTR _a[ebp]
   add   ecx, 1
   mov   DWORD PTR _a[ebp], ecx
   mov   edx, DWORD PTR _a[ebp]
   add   edx, DWORD PTR _a[ebp]
   mov   DWORD PTR _a[ebp], edx

; 7    :    printf("%dn", a);

   mov   esi, esp
   mov   eax, DWORD PTR _a[ebp]
   push   eax
   push   OFFSET ??_C@_03PMGGPEJJ@?CFd?6?AA@
   call   DWORD PTR __imp__printf


Результат, как не сложно убедиться, 14. Но на другом компиляторе может быть 13, или вовсе 7, или даже 6. Потому что сайдэффект оператора = не обязан выполняться после ++.
Гость
 

С++ и другие

Непрочитанное сообщение snb » 27 ноя 2008, 07:53:19

PV писал(а):или вовсе 7, или даже 6


Думаеццо, тут ты загнул. Это как у нас в Курске выступает группа "Пилот" с новой концертной программой "1+1=1". Вот такой вот у них компилятор…
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 27 ноя 2008, 11:59:45

PV писал(а): Потому что сайдэффект оператора = не обязан выполняться после ++.
Вотъ тутъ неправда ваша…
Стандартъ(CPP во всяком случае) явно подразумеваетъ что операторъ = выполняется справа налево… Т.е. a=b=c есть тоже что a=(b=c)

Код: Выделить всё
Build started 27.11.2008 12:09:59.
__________________________________________________
Project "C:Documents and SettingsilmarranenМои документыRAD StudioProjectsProject1.cbproj" (Make target(s)):
Target MakeObjs:
    Target _CppDepCheck:
        Modified: File1.cpp
    Target CppCompile:
        Target _CppCoreCompile:
            c:program filescodegearrad studio6.0binbcc32.exe -D_DEBUG;NO_STRICT -D_RTLDLL;_NO_VCL -I"C:Program FilesCodeGearRAD Studio6.0includeboost_1_35boosttr1tr1";"c:program filescodegearrad studio6.0include";"c:program filescodegearrad studio6.0includedinkumware";"c:program filescodegearrad studio6.0includevcl";"C:Program FilesCodeGearRAD Studio6.0includeboost_1_35";"c:program filescodegearrad studio6.0ObjReposCpp";"c:program filescodegearrad studio6.0includeIndy10";"c:program filescodegearrad studio6.0RaveReportsLib" -y -k -r- -c  -tWC -C8 -oDebugFile1.obj -w-par -Od  -O -OS -Ob -Oc -Oi -Ov -Or -vi- -v -H=DebugProject1.pch -H File1.cpp
Target _PerformLink:
    c:program filescodegearrad studio6.0binilink32.exe -LDebug;"c:program filescodegearrad studio6.0libdebug";"c:program filescodegearrad studio6.0lib";"c:program filescodegearrad studio6.0libobj";"c:program filescodegearrad studio6.0libpsdk";"c:program filescodegearrad studio6.0lib";"c:program filescodegearrad studio6.0libIndy10";"c:program filescodegearrad studio6.0RaveReportsLib";"C:Documents and SettingsAll UsersДокументыRAD Studio6.0DCP" -jDebug;"c:program filescodegearrad studio6.0libdebug";"c:program filescodegearrad studio6.0lib";"c:program filescodegearrad studio6.0libobj";"c:program filescodegearrad studio6.0libpsdk";"c:program filescodegearrad studio6.0lib";"c:program filescodegearrad studio6.0libIndy10";"c:program filescodegearrad studio6.0RaveReportsLib";"C:Documents and SettingsAll UsersДокументыRAD Studio6.0DCP" -lDebug -v -Gn -G8 c0x32 DebugFile1.obj , DebugProject1.exe , DebugProject1.map , import32.lib cw32i.lib , ,
Build succeeded.
    0 Warning(s)
    0 Error(s)
Time Elapsed 00:00:01.89


Сие?
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение Гость » 28 ноя 2008, 22:19:29

snb писал(а):
PV писал(а):или вовсе 7, или даже 6


Думаеццо, тут ты загнул. Это как у нас в Курске выступает группа "Пилот" с новой концертной программой "1+1=1". Вот такой вот у них компилятор…


Так у них просто булево поле, и + соответсвенно - логический. :)
Alex ilmarranen писал(а):
PV писал(а): Потому что сайдэффект оператора = не обязан выполняться после ++.
Вотъ тутъ неправда ваша…
Стандартъ(CPP во всяком случае) явно подразумеваетъ что операторъ = выполняется справа налево… Т.е. a=b=c есть тоже что a=(b=c)


Ты (как и 90-99% людей думающих, что они знают C/С++) путаешь operator precedence &associativity и execution order.
То, что = "выполняется" справа налево - это associativity.
Приведу попроще пример на operator precedence.
Пусть есть 3 функции - f(), g() и h(), каждая печатает свое имя.
В каком порядке напечатаются их имена, если они вызваны из выражения
a=f()+g()*h();

Думаешь, сначала g, потом h, потом f? ;) Нет, в любом. Потому что их возвращаемые значения будут потом перемножены правильно, А САЙДЭФФЕКТЫ (такие, как вызовы функции или присвоения значения переменным) СОГЛАСНО СТАНДАРТУ МОГУТ ВОЗНИКНУТЬ В ЛЮБОЕ ВРЕМЯ В ЛЮБОМ ПОРЯДКЕ, НО ОБЯЗАНЫ ЗАКОНЧИТСЯ ВСЕ ТОЛЬКО НА SEQUENCE POINT.
Ссылку на то, что такое "sequence point" я уже приводил, напомню, он наступает:
1) для sentence - в конце sentence (условно говоря, на точке с запятой)
2) для аргументов функций - перед вызовом функции
3) для аргументов операторов for, if, while - после каждого аргумента
4) после вычисления левого аргумента НЕПЕРЕГРУЖЕННЫХ операций &&, ||, запятая, ?:
5) в конце выполнения функции

Ты видишь в этом списке "после правого аргумента operator="? Нет? Потому что его там нет. Поэтому код
int a = 5;
a=++a + ++a;
может быть прекрасно транслирован так:
MOV a, 5
MOV EAX, a
INC EAX
MOV EBX, a
MOV EBX
MOV a, EAX
ADD a, EBX
MOV a, EAX
MOV a, EBX ;sequence point

Как не сложно догадаться, рузельтатом будет 6.

Alex ilmarranen писал(а):
Код: Выделить всё
bcc32.exe -D_DEBUG
...
-oDebugFile1.obj
...-Od
...-H=DebugProject1.pch
ilink32.exe -LDebug
...-lDebug
... DebugFile1.obj , DebugProject1.exe , DebugProject1.map


Сие?


Оно. Как не сложно увидеть из оставленных мной строчек, билд был отладочный. Как я и сказал. :)
Гость
 

С++ и другие

Непрочитанное сообщение snb » 28 ноя 2008, 23:26:19

PV писал(а):MOV a, 5
MOV EAX, a
INC EAX
MOV EBX, a
MOV EBX
MOV a, EAX
ADD a, EBX
MOV a, EAX
MOV a, EBX ;sequence point


Сам написал или вырезал откуда? А ты точно не брешешь? :-) Как-то мне сцыкотно… я на измене… не-не-не, Дэвид Блэйн…

А как же будет выполняться
a = 5;
a = a + a;

?
Может получится 5?
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 29 ноя 2008, 02:14:41

PV писал(а):
:D Иными словами присвоение не гарантируется никогда?

Вобщемъ snb уже написалъ…
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение Гость » 30 ноя 2008, 16:11:04

snb писал(а):
PV писал(а):MOV a, 5
MOV EAX, a
INC EAX
MOV EBX, a
MOV EBX
MOV a, EAX
ADD a, EBX
MOV a, EAX
MOV a, EBX ;sequence point


Сам написал или вырезал откуда? А ты точно не брешешь? :-) Как-то мне сцыкотно… я на измене… не-не-не, Дэвид Блэйн…


Сам написал. Все согласно минному полю №14882. :)

snb писал(а):А как же будет выполняться
a = 5;
a = a + a;

?
Может получится 5?


Нет, сайдэффект только один - присвоение суммы а+а переменной а. Такое его значение и будет.
Alex ilmarranen писал(а):
PV писал(а):
:D Иными словами присвоение не гарантируется никогда?

Вобщемъ snb уже написалъ…


Почему же? Когда до следующей sequence point лишь один сайдэффект на одной переменной - мы знаем, чему она будет равна.
Гость
 

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 30 ноя 2008, 17:37:18

Ладно.. я спорить не буду… Мне кажется это конечно не такъ.. Но я не силёнъ въ механизмовъ компиляторовъ.. И времени разбираться съ этимъ сейчасъ нету… Есть более важные вещи…
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение Гость » 30 ноя 2008, 22:48:55

Alex ilmarranen писал(а):Ладно.. я спорить не буду… Мне кажется это конечно не такъ.. Но я не силёнъ въ механизмовъ компиляторовъ.. И времени разбираться съ этимъ сейчасъ нету…


А я силен, в C++ в частности. Одно время был номером 1 в мире на тестах Brainbench (собственно, через это меня и нашел американский работодатель - и не один). И профессионально программирую на нем больше 13 лет, под целую кучу компиляторов и платформ.
Иногда проще поверить. ;)
Гость
 

С++ и другие

Непрочитанное сообщение snb » 01 дек 2008, 00:42:40

PV писал(а):А я силен, в C++ в частности. Одно время был номером 1 в мире на тестах Brainbench (собственно, через это меня и нашел американский работодатель - и не один). И профессионально программирую на нем больше 13 лет, под целую кучу компиляторов и платформ.
Иногда проще поверить. ;)


А у меня пиписька длинней! :-)
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение Гость » 01 дек 2008, 15:26:22

snb писал(а):
PV писал(а):А я силен, в C++ в частности. Одно время был номером 1 в мире на тестах Brainbench (собственно, через это меня и нашел американский работодатель - и не один). И профессионально программирую на нем больше 13 лет, под целую кучу компиляторов и платформ.
Иногда проще поверить. ;)


А у меня пиписька длинней! :-)


А когда это ты успел померять? ;)
Гость
 

Пред.

Вернуться в Программирование

Кто сейчас на форуме

Зарегистрированные пользователи: Bing [Bot], DotBot [Crawler], Google [Bot], SEMrush [Бот], Trendiction [Бот]

cron