С++ и другие

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

С++ и другие

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

народ, вот такая комбинация:

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


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

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

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

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 26 ноя 2008, 19:08:40

двинадцать…
Если не ошибаюсь въ какой то книжке написано было… Точно не помню… Но кажется операция инкремента выполняется для переменной въ одномъ операторе единожды…

Я правъ? *SCRATCH*
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение AJ » 26 ноя 2008, 21:20:22

Anri писал(а):"a" в С

мне думается тринадцать - так подсказывает мой опыт программирования контроллеров на Си:)хотя я не программист(с)
intellect-kursk.ru - английский язык в Курске
AJ
Завсегдатай
Завсегдатай
 
Сообщения: 530
Зарегистрирован: 02 июл 2006, 22:06:38
Пол: Мужской

С++ и другие

Непрочитанное сообщение Anri » 26 ноя 2008, 21:25:37

не.. ответ должен выглядеть так:
в С, С++, а=___ (ладно уж.. у них будет одинаково)
в С#, (Java.Net) а=___

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

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

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

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

С++ и другие

Непрочитанное сообщение snb » 26 ноя 2008, 21:45:56

Да, смешно получается, я тоже думал, что в C++/C# будет одинаково, т.е. 13. Понял фишку, как раз после дизассемблирования С++.
Вот почему я уже давно не использую инкремент в одной строке с другими операциями. Чтобы потом голову ни я, ни другие голову не сломали, как это все работает.
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение Гость » 26 ноя 2008, 21:54:11

А на самом деле правильный ответ для C и C++ - "неопределено". И дизассемблированием на него не ответишь, т.к. другой компилятор, или уже следующая версия того же компилятора, или тот же компилятор, но с другими флажками сгенерит совсем разный код. Читайте стандарты.

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

С++ и другие

Непрочитанное сообщение Anri » 26 ноя 2008, 22:01:20

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


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

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

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 26 ноя 2008, 22:04:57

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

С++ и другие

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

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

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


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

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

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


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

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

С++ и другие

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

PV писал(а):отводить в лесок и бить прикладом в висок. :)


Все-таки, Паш, USA сделали тебя жестоким. То отдельности почикать предлагаешь, то прикладом в висок… *HOHO*
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение AJ » 26 ноя 2008, 22:25:51

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

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

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

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

ну и там обвески по мелочи. И на дисплее горит k=13. вот.
intellect-kursk.ru - английский язык в Курске
AJ
Завсегдатай
Завсегдатай
 
Сообщения: 530
Зарегистрирован: 02 июл 2006, 22:06:38
Пол: Мужской

С++ и другие

Непрочитанное сообщение Гость » 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 называется.
Гость
 

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 26 ноя 2008, 22:31:35

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

http://slil.ru/26372832

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

С++ и другие

Непрочитанное сообщение Гость » 26 ноя 2008, 22:32:37

snb писал(а):
PV писал(а):отводить в лесок и бить прикладом в висок. :)


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


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

С++ и другие

Непрочитанное сообщение snb » 26 ноя 2008, 22:37:16

Alex ilmarranen писал(а):Съ чистымъ С дела не имелъ…


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

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


Суров ты… Можно было текстовый copy/paste сделать.
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 26 ноя 2008, 22:37:55

На самомъ деле да… я самъ вотъ уже не поленился и нашёлъ…На 2005 годъ было неопределённо…
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение Гость » 26 ноя 2008, 22:38:41

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

http://slil.ru/26372832

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


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

С++ и другие

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

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

С++ и другие

Непрочитанное сообщение Гость » 26 ноя 2008, 22:45:05

Alex ilmarranen писал(а):На самомъ деле да… я самъ вотъ уже не поленился и нашёлъ…На 2005 годъ было неопределённо…


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

С++ и другие

Непрочитанное сообщение snb » 26 ноя 2008, 22:46:08

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


А ведь это гораздо проще, чем ломать голову над явно искусственным примером! Вот он, вопрос применения IT-технологий в зависимости от реальной необходимости! *HOHO*
Шутю, не обижайся.
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

С++ и другие

Непрочитанное сообщение Alex ilmarranen » 26 ноя 2008, 22:46:19

Код: Выделить всё
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 Вовсе нетъ… =) было бъ за что….
Alex ilmarranen
 

С++ и другие

Непрочитанное сообщение snb » 26 ноя 2008, 22:49:58

Alex ilmarranen писал(а):Включилъ все варианты оптимизации… *SCRATCH*
Можетъ у меня CodeGear 2009 - некавайно? *SCRATCH*


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

С++ и другие

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

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. А того кто пишет так надо к столбу привязывать, Паша апсалютно прав
Давай с тобой поговорим, прости, не знаю, как зовут.
Но открывается другим, все то, что близким берегут.
Ты скажешь: "Все наоборот, согласно логике вещей",
Но это редкий поворот, а, может, нет его вообще.

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

С++ и другие

Непрочитанное сообщение Гость » 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
Гость
 

С++ и другие

Непрочитанное сообщение snb » 26 ноя 2008, 22:59:30

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


Мой моцк опух… Это у тебя еще день, а мне пора рюмку и в койку. Пойду так и сделаю… Ауфвидерзейн!
snb
Старожил
Старожил
 
Сообщения: 1095
Зарегистрирован: 01 дек 2006, 08:46:05
Пол: Мужской
Имя: Сергей

След.

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

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

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

cron