Страница 1 из 1

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 16:33:10
Anri
народ, вот такая комбинация:

Код: Выделить всё
int a=5;
a = ++a + ++a;


чему будет равно "a" в С, С++, C#?

--
/Просьба, господ: CY, PV, SNB/ не заморачиваться, вопрос не вам.
---
для тех кто ответит: ответьте за одно на вопрос - "а почему?"

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 19:08:40
Alex ilmarranen
двинадцать…
Если не ошибаюсь въ какой то книжке написано было… Точно не помню… Но кажется операция инкремента выполняется для переменной въ одномъ операторе единожды…

Я правъ? *SCRATCH*

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 21:20:22
AJ
Anri писал(а):"a" в С

мне думается тринадцать - так подсказывает мой опыт программирования контроллеров на Си:)хотя я не программист(с)

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 21:25:37
Anri
не.. ответ должен выглядеть так:
в С, С++, а=___ (ладно уж.. у них будет одинаково)
в С#, (Java.Net) а=___

и если они отличаются, а они отличаются, то очень хочется узнать причину. Причина, в данной задаче, - вообще главный вопрос.
AJ писал(а):
Anri писал(а):"a" в С

мне думается тринадцать - так подсказывает мой опыт программирования контроллеров на Си:)хотя я не программист(с)

это ты странные контроллеры на С программировал :). точнее ты их тогда с ошипкой программировал. (подстказка) напиши на С ++A + ++A и посмотри дисассемблированный код

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 21:45:56
snb
Да, смешно получается, я тоже думал, что в C++/C# будет одинаково, т.е. 13. Понял фишку, как раз после дизассемблирования С++.
Вот почему я уже давно не использую инкремент в одной строке с другими операциями. Чтобы потом голову ни я, ни другие голову не сломали, как это все работает.

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 21:54:11
Гость
А на самом деле правильный ответ для C и C++ - "неопределено". И дизассемблированием на него не ответишь, т.к. другой компилятор, или уже следующая версия того же компилятора, или тот же компилятор, но с другими флажками сгенерит совсем разный код. Читайте стандарты.

Поэтому человека, пишушего так, надо бить линейкой по рукам. А если это не студент и эта дрянь пишется в реальную программу - то отводить в лесок и бить прикладом в висок. :)

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:01:20
Anri
snb писал(а):Да, смешно получается, я тоже думал, что в C++/C# будет одинаково, т.е. 13. Понял фишку, как раз после дизассемблирования С++.
Вот почему я уже давно не использую инкремент в одной строке с другими операциями. Чтобы потом голову ни я, ни другие голову не сломали, как это все работает.


молчи.. не пацказывай

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:04:57
Alex ilmarranen
PV писал(а):А на самом деле правильный ответ для C и C++ - "неопределено".
Точно! Именно такъ и было написано…. Результатъ не гарантируется…
Про остальные ничё не знаю… не знакомъ *SCRATCH*

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:06:56
Anri
PV писал(а):А на самом деле правильный ответ для C и C++ - "неопределено". И дизассемблированием на него не ответишь, т.к. другой компилятор, или уже следующая версия того же компилятора, или тот же компилятор, но с другими флажками сгенерит совсем разный код. Читайте стандарты.

Поэтому человека, пишушего так, надо бить линейкой по рукам. А если это не студент и эта дрянь пишется в реальную программу - то отводить в лесок и бить прикладом в висок. :)


ты как тот пашляк.. нет выпить и закусить, а он ещё дефку и ф кусты :).
Паш, в С так и останется. Для всех версий. поверь. "++" - всегда одно и то же. Подождём наших студентов из Fachhochschulen. Может они узнают? Тем паче, что они писали для одноголовых кристалов. Там точно - стандарт инкремента ;).

Кстати, Паш, а вот я теюя сдам юниксоидам. Они тебя слюнами зальют и анафеме придадут за то, шо ты написал *HOHO*. Для них ЭТО как раз "определено" и однозначно. Они меня заспорили и я здалсо /один хрен я не ф курсе ихней специфики *HOHO*/

Но правило правильное: все винусоиды думают одинаково :). Я им так же как ты ответил
Alex ilmarranen писал(а):
PV писал(а):А на самом деле правильный ответ для C и C++ - "неопределено".
Точно! Именно такъ и было написано…. Результатъ не гарантируется…
Про остальные ничё не знаю… не знакомъ *SCRATCH*


не.. так не пойдёт. на сегодня: гарантировано. как минимум для С
тада дай ответ для С. Как будет там. Тем паче, что ты у нас безопасник и тебе положено иметь доступ к языкам совсем более-низкого уровня ;)

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:11:22
snb
PV писал(а):отводить в лесок и бить прикладом в висок. :)


Все-таки, Паш, USA сделали тебя жестоким. То отдельности почикать предлагаешь, то прикладом в висок… *HOHO*

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:25:51
AJ
Anri писал(а):это ты странные контроллеры на С программировал . точнее ты их тогда с ошипкой

я и не претендовал на последнюю инстанцию:) Но.. я сейчас в Протеусе (такая прога для моделирования микропроцессорных устройств) соединил контроллер ATMega16 и LCD. Написал прогу имеено что такую:

int k = 5;
k = ++k + ++k;

sprintf(lcd_buffer,"encoder=%d, k=%d",pos, k);

ну и там обвески по мелочи. И на дисплее горит k=13. вот.

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:30:39
Гость
Anri писал(а):
PV писал(а):А на самом деле правильный ответ для C и C++ - "неопределено". И дизассемблированием на него не ответишь, т.к. другой компилятор, или уже следующая версия того же компилятора, или тот же компилятор, но с другими флажками сгенерит совсем разный код. Читайте стандарты.

Поэтому человека, пишушего так, надо бить линейкой по рукам. А если это не студент и эта дрянь пишется в реальную программу - то отводить в лесок и бить прикладом в висок. :)


ты как тот пашляк.. нет выпить и закусить, а он ещё дефку и ф кусты :).
Паш, в С так и останется. Для всех версий. поверь. "++" - всегда одно и то же.


Не поверю, потому что я это точно знаю.

Anri писал(а):Подождём наших студентов из Fachhochschulen. Может они узнают? Тем паче, что они писали для одноголовых кристалов. Там точно - стандарт инкремента ;).


С и С++ - это не конкретный компилятор, это стандарты. Стандарты говорят - "неопределено". И на практике так и есть.
На, просвещайся:
http://en.wikipedia.org/wiki/Sequence_point
А то забыл уже, на дотнете программируя, как оно в жестоком и неженственном мире сей. "Шаг влево, шаг вправо - неопределено".

Anri писал(а):Кстати, Паш, а вот я теюя сдам юниксоидам. Они тебя слюнами зальют и анафеме придадут за то, шо ты написал *HOHO*. Для них ЭТО как раз "определено" и однозначно. Они меня заспорили и я здалсо /один хрен я не ф курсе ихней специфики *HOHO*/


Андрюх, да я сам давно юниксоид. Наш софт собирался/собирается под Win32, Win64, Linux, Solaris 3-х версий, AIX 2-х версий, HP-UX на Itanium, HP-UX на PA-RISC, на Tru64 UNIX когда-то (сдохла эта платформа, туда ее), компиляторами разных производителей и разных версий. При таком зоопарке любой "нестандарт" и "неопределено" оборачивается "неработает". Именно поэтому я знаю такие вещи назубок. ISO/IEC 14882 называется.

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:31:35
Alex ilmarranen
Anri писал(а):не.. так не пойдёт. на сегодня: гарантировано. как минимум для С
тада дай ответ для С. Как будет там. Тем паче, что ты у нас безопасник и тебе положено иметь доступ к языкам совсем более-низкого уровня
Ну для С++… Съ чистымъ С дела не имелъ…

http://slil.ru/26372832

На дисплее a=14 :)

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:32:37
Гость
snb писал(а):
PV писал(а):отводить в лесок и бить прикладом в висок. :)


Все-таки, Паш, USA сделали тебя жестоким. То отдельности почикать предлагаешь, то прикладом в висок… *HOHO*


Это не уса, это мультиплатформенный ++. Выживают только фашисты. :) Для сиссис и пуссис придумали жабу. :) :)

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:37:16
snb
Alex ilmarranen писал(а):Съ чистымъ С дела не имелъ…


А я вот помню Турбо-Цэ 2.0…

Alex ilmarranen писал(а):http://slil.ru/26372832


Суров ты… Можно было текстовый copy/paste сделать.

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:37:55
Alex ilmarranen
На самомъ деле да… я самъ вотъ уже не поленился и нашёлъ…На 2005 годъ было неопределённо…

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:38:41
Гость
Alex ilmarranen писал(а):
Anri писал(а):не.. так не пойдёт. на сегодня: гарантировано. как минимум для С
тада дай ответ для С. Как будет там. Тем паче, что ты у нас безопасник и тебе положено иметь доступ к языкам совсем более-низкого уровня
Ну для С++… Съ чистымъ С дела не имелъ…

http://slil.ru/26372832

На дисплее a=14 :)


Без разницы.
А теперь скомпилируй это с включенной оптимизацией (совершенно очевидно, что данный ассемблер - с выключенной).

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:39:27
Alex ilmarranen
2snb Чё та да… не предположилъ наличия такой возможности… %)

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:45:05
Гость
Alex ilmarranen писал(а):На самомъ деле да… я самъ вотъ уже не поленился и нашёлъ…На 2005 годъ было неопределённо…


И всегда было неопределено. И всегда будет. Потому что весь смысл сей - скорость, и поэтому переставлять команды местами как удобно компилятору и быстро на целевой платформе, промеж соседних sequence points, запрещать нельзя. Не могете с этим бороться - пожалуйте бриться. Есть огромное поле для жаб, вибейсиков, сишарпов и т.п.

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:46:08
snb
Alex ilmarranen писал(а):2snb Чё та да… не предположилъ наличия такой возможности… %)


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

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:46:19
Alex ilmarranen
Код: Выделить всё
File1.cpp.11: int a=5;
0040116C C745FC05000000   mov [ebp-04],00000005
File1.cpp.12: a = ++a + ++a;
00401173 FF45FC           inc dword ptr [ebp-04]
00401176 FF45FC           inc dword ptr [ebp-04]
00401179 8B45FC           mov eax,[ebp-04]
0040117C 0145FC           add [ebp-04],eax


Включилъ все варианты оптимизации… *SCRATCH*

Можетъ у меня CodeGear 2009 - некавайно? *SCRATCH*
2snb Вовсе нетъ… =) было бъ за что….

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:49:58
snb
Alex ilmarranen писал(а):Включилъ все варианты оптимизации… *SCRATCH*
Можетъ у меня CodeGear 2009 - некавайно? *SCRATCH*


Забей… Просто не пиши такой код и все будет OK. Если я увижу такой код у себя на работе, я приложу все силы, чтобы этого человека уволили.

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:55:22
Anri
AJ писал(а):
Anri писал(а):это ты странные контроллеры на С программировал . точнее ты их тогда с ошипкой

я и не претендовал на последнюю инстанцию:) Но.. я сейчас в Протеусе (такая прога для моделирования микропроцессорных устройств) соединил контроллер ATMega16 и LCD. Написал прогу имеено что такую:

int k = 5;
k = ++k + ++k;

sprintf(lcd_buffer,"encoder=%d, k=%d",pos, k);

ну и там обвески по мелочи. И на дисплее горит k=13. вот.


жесть.
отнако говорящая о многом, а имено: учите матчасть.
вааще-то ++ подразумевает юзание одной и той же ячейки памяти.
но, как видим, таки - как бох на душу положит. у каждого своё мировоззрение.

итак, в априоре долже быть так:
AJ писал(а):
Anri писал(а):это ты странные контроллеры на С программировал . точнее ты их тогда с ошипкой

я и не претендовал на последнюю инстанцию:) Но.. я сейчас в Протеусе (такая прога для моделирования микропроцессорных устройств) соединил контроллер ATMega16 и LCD. Написал прогу имеено что такую:

int k = 5;
k = ++k + ++k;
++k = 6
++k = 7
итого: k = 7 + 7 = 14.

но в С#и жабе будет будет 13, как и написал AJ.
кстати 13 мне кажется более правильным, нежели 14. А того кто пишет так надо к столбу привязывать, Паша апсалютно прав

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:55:58
Гость
Alex ilmarranen писал(а):
Код: Выделить всё
File1.cpp.11: int a=5;
0040116C C745FC05000000   mov [ebp-04],00000005
File1.cpp.12: a = ++a + ++a;
00401173 FF45FC           inc dword ptr [ebp-04]
00401176 FF45FC           inc dword ptr [ebp-04]
00401179 8B45FC           mov eax,[ebp-04]
0040117C 0145FC           add [ebp-04],eax


Включилъ все варианты оптимизации… *SCRATCH*

Можетъ у меня CodeGear 2009 - некавайно? *SCRATCH*


Не верю что включил. Даже борланд (который теперь CodeGear) умел неплохо оптимизировать еще 15 лет назад.
После нормальной оптимизации вообще вся переменная и все операции с ней будут выкиты. Из головы - выглядеть будет примерно так:
PUSH 14 ;or whatever
CALL printf

А, нет, в printf надо будет адрес кинуть, так что
MOV [EBP -4], 14
LEA EAX, [EBP -4] ;не помню команды загрузки адреса - склероз, что-то вроде того
PUSH EAX

CALL printf

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 22:59:30
snb
PV писал(а): (который теперь CodeGear) умел неплохо оптимизировать еще 15 лет назад.
После нормальной оптимизации вообще вся переменная и все операции с ней будут выкиты. Из головы - выглядеть будет примерно так:
PUSH 14 ;or whatever
CALL printf


Мой моцк опух… Это у тебя еще день, а мне пора рюмку и в койку. Пойду так и сделаю… Ауфвидерзейн!

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 23:00:15
Anri
snb писал(а):
Alex ilmarranen писал(а):2snb Чё та да… не предположилъ наличия такой возможности… %)


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


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


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

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 23:05:39
Alex ilmarranen
PV писал(а):Не верю что включил.
:D Могу видео снять?
Хатити?

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

С++ и другие

Непрочитанное сообщениеДобавлено: 26 ноя 2008, 23:10:06
Anri
Alex ilmarranen писал(а):
PV писал(а):Не верю что включил.
:D Могу видео снять?
Хатити?


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

С++ и другие

Непрочитанное сообщениеДобавлено: 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. Потому что сайдэффект оператора = не обязан выполняться после ++.

С++ и другие

Непрочитанное сообщениеДобавлено: 27 ноя 2008, 07:53:19
snb
PV писал(а):или вовсе 7, или даже 6


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

С++ и другие

Непрочитанное сообщениеДобавлено: 27 ноя 2008, 11:59:45
Alex ilmarranen
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


Сие?

С++ и другие

Непрочитанное сообщениеДобавлено: 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


Сие?


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

С++ и другие

Непрочитанное сообщениеДобавлено: 28 ноя 2008, 23:26:19
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


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

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

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

С++ и другие

Непрочитанное сообщениеДобавлено: 29 ноя 2008, 02:14:41
Alex ilmarranen
PV писал(а):
:D Иными словами присвоение не гарантируется никогда?

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

С++ и другие

Непрочитанное сообщениеДобавлено: 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 лишь один сайдэффект на одной переменной - мы знаем, чему она будет равна.

С++ и другие

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

С++ и другие

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


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

С++ и другие

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


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

С++ и другие

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


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


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