|
|
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Имеется код: Код: plaintext 1. 2. Чему будет равно i в результате? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 10:59 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpaceВ с++ 14 Но почему 14??????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:07 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун TopSpaceВ с++ 14 Но почему 14??????? Сначала прединкременты, потом сложение. Эта тема подробно разбиралась, где-то пол года назад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:10 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Ну хорошо, чуть усложним вариант: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:11 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунНу хорошо, чуть усложним вариант: Код: plaintext 1. 2. 3. С какой целью вы интересуетесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:25 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:26 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Akh Александр ГoлдунНу хорошо, чуть усложним вариант: Код: plaintext 1. 2. 3. С какой целью вы интересуетесь? Да в общем-то ни с какой. Давно уже не брал в руки С++, хотя когда-то весьма активно его использовал. И тут спросили по ICQ. С ходу ответил одно, скомпилял, проверил - получил другое. Смутило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:28 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpace Код: plaintext 1. 2. 3. 14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается) Проверил == 11. У меня логика не основывается на областях памяти: Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:30 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpace Код: plaintext 1. 2. 3. 10. При этом a=5, b=5 получилось. C++ Builder 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:30 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун Akh Александр ГoлдунНу хорошо, чуть усложним вариант: Код: plaintext 1. 2. 3. С какой целью вы интересуетесь? Да в общем-то ни с какой. Давно уже не брал в руки С++, хотя когда-то весьма активно его использовал. И тут спросили по ICQ. С ходу ответил одно, скомпилял, проверил - получил другое. Смутило. Если интересна тема, то можете поискать эту ветку. Даже разбирали asm для выяснения обстаятельств. В чем-то даже разобрались. Но эта тонкая материя, нет необходимости заморачиваться по этому поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:33 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Akh Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5. так а почему 5? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:39 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpace Akh Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5. так а почему 5? Потом декремент вернул i значение 5-ти: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:41 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Akh TopSpace Код: plaintext 1. 2. 3. 14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается) Проверил == 11. У меня логика не основывается на областях памяти: Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5. В каком компиляторе? C++Builder 6 выдал i=10, a=5, b=5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:43 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Akh TopSpace Akh Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5. так а почему 5? Потом декремент вернул i значение 5-ти: Код: plaintext 1. 2. 3. Разве приоритет не справа на лево (например сцепки операторов <<)?? Тогда Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:47 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpaceВ с++ 14)) В c# 13 а почему в С# 13 ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:48 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун Akh TopSpace Код: plaintext 1. 2. 3. 14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается) Проверил == 11. У меня логика не основывается на областях памяти: Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5. В каком компиляторе? C++Builder 6 выдал i=10, a=5, b=5 gcc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:49 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
батрачище TopSpaceВ с++ 14)) В c# 13 а почему в С# 13 ??? Потому что при вычислении ++i создается новый объект, который при втором ++i не трогается, и участвует в сложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:53 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Akh Если интересна тема, то можете поискать эту ветку. Даже разбирали asm для выяснения обстаятельств. В чем-то даже разобрались. Тема любопытна. Я догадывался, что это, возможно, обсуждалось, и может не один раз. Но найти не удалось. Ключевые слова не подскажете? Akh Но эта тонкая материя, нет необходимости заморачиваться по этому поводу. В принципе да. За такой код в продакшн надо гнать в шею. Сомневаешься - упрости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:53 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpace батрачище TopSpaceВ с++ 14)) В c# 13 а почему в С# 13 ??? Потому что при вычислении ++i создается новый объект, который при втором ++i не трогается, и участвует в сложении. какой гемор!.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:54 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
TopSpace[quot Akh] Разве приоритет не справа на лево (например сцепки операторов <<)?? Тогда Код: plaintext 1. 2. 3. Может и справа налево. Тогда логика какая-то другая. Но как мы уже убедились, на разных компиляторах, результат получается разный. Значит стандартом не оговорено вычесление подобных выражений (с множественным использованием переменных с пре и пост инекрементами). Таким образом, исследование подобного вопроса, может представлять интерес чисто научный для конкретного компилятора. Можно будет даже выдвинуть теорию, как в таких случаях ведет себя компилятор. Для текущей версии, для текущей оптимизации. Так что, к изучению с/с++, это исследование не имеет ни какого отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:55 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
a Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 11:56 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунТема любопытна. Я догадывался, что это, возможно, обсуждалось, и может не один раз. Но найти не удалось. Ключевые слова не подскажете? ++i или i++? Префиксные операции и стандарт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 12:03 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
батрачищеa Код: plaintext 1. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 12:27 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
http://bash.org.ru/quote.php?num=212679 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 12:54 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Java1.5: Код: plaintext 1. 2. Код: plaintext 1. 2. Код: plaintext 1. забавная тема :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 13:01 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Ну орлы, еще дедушки Корнеган и Ричи завещали так не делать, это раз. Вот вторых тест некорректный - нормальный компилер (во всяком случае gcc) все должен был еще на этапе компиляции вычислить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 14:21 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
blindedНу орлы, еще дедушки Корнеган и Ричи завещали так не делать, это раз. Вот вторых тест некорректный - нормальный компилер (во всяком случае gcc) все должен был еще на этапе компиляции вычислить... gcc 3.3.3 нормальный, вроде, но ему по барабану. Считает по своему и доволен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 14:27 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
blindedНу орлы, еще дедушки Корнеган и Ричи завещали так не делать, это раз. Вот вторых тест некорректный - нормальный компилер (во всяком случае gcc) все должен был еще на этапе компиляции вычислить... MSVC 2003 Без оптимизации: 00411A55 mov eax,dword ptr 00411A58 add eax,1 00411A5B mov dword ptr ,eax 00411A5E mov ecx,dword ptr 00411A61 add ecx,1 00411A64 mov dword ptr ,ecx 00411A67 mov edx,dword ptr 00411A6A add edx,dword ptr 00411A6D mov dword ptr ,edx С оптимизацией, действительно свертывает в константу, но в 14 !!! На g++ (GCC) 3.4.6 [FreeBSD] 20060305 результат то-же 14 (про 3.3.3 ВРАТЬ не буду) На Perl-е аналогично ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 14:48 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун пишет: > Автор: "Александр Гoлдун" > Имеется код: > > int i = *5*; > i = ++i + ++i; > > > Чему будет равно i в результате? Будет равно Undefined Behaviour. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 16:01 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Это выражение пример неопределенного поведения. Вы пытаетесь изменить одну и туже переменную и между этими изменениями нет ни одной точки следования. Здесь, в принципе, компилятор имеет право отформатировать ваш винчестер, а вы гадаете чему оно равно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 16:03 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун пишет: > i = ++i + ++i; > Чему будет равно i в результате? Вообще, ребята, мы тут дружно решили, прочитав ветку, что иногда лучше жевать, чем писать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 16:06 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун TopSpaceВ с++ 14 Но почему 14??????? ildasm (VS2003): C++: IL_0000: ldc.i4.5 IL_0001: stloc.0 IL_0002: ldloc.0 IL_0003: ldc.i4.1 IL_0004: add IL_0005: stloc.0 IL_0006: ldloc.0 IL_0007: ldc.i4.1 IL_0008: add IL_0009: stloc.0 IL_000a: ldloc.0 IL_000b: ldloc.0 IL_000c: add IL_000d: stloc.0 IL_000e: ldloc.0 C#: IL_0000: ldc.i4.5 IL_0001: stloc.0 IL_0002: ldloc.0 IL_0003: dup IL_0004: ldc.i4.1 IL_0005: add IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: dup IL_0009: ldc.i4.1 IL_000a: add IL_000b: stloc.0 IL_000c: add IL_000d: stloc.0 IL_000e: ldloc.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2007, 16:27 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) MSVC 2003 Без оптимизации: 00411A55 mov eax,dword ptr 00411A58 add eax,1 00411A5B mov dword ptr ,eax 00411A5E mov ecx,dword ptr 00411A61 add ecx,1 00411A64 mov dword ptr ,ecx 00411A67 mov edx,dword ptr 00411A6A add edx,dword ptr 00411A6D mov dword ptr ,edx Слушай, скажи а как ты ассемблерный код проги получил? Я VC6 такой чтуки не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 15:08 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Дмитрий Иванович Gluk (Kazan) MSVC 2003 Без оптимизации: 00411A55 mov eax,dword ptr 00411A58 add eax,1 00411A5B mov dword ptr ,eax 00411A5E mov ecx,dword ptr 00411A61 add ecx,1 00411A64 mov dword ptr ,ecx 00411A67 mov edx,dword ptr 00411A6A add edx,dword ptr 00411A6D mov dword ptr ,edx Слушай, скажи а как ты ассемблерный код проги получил? Я VC6 такой чтуки не нашел. В дебаггер войди и выбери Show Assembler Intsruction. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 15:11 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Дмитрий Ивановичкак ты ассемблерный код проги получил?у нас в бормановских средах, если есть хотя бы один asm, то генерится ассемблерный файлик, который уже потом компилится Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 15:14 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Дмитрий Иванович Gluk (Kazan) MSVC 2003 Без оптимизации: 00411A55 mov eax,dword ptr 00411A58 add eax,1 00411A5B mov dword ptr ,eax 00411A5E mov ecx,dword ptr 00411A61 add ecx,1 00411A64 mov dword ptr ,ecx 00411A67 mov edx,dword ptr 00411A6A add edx,dword ptr 00411A6D mov dword ptr ,edx Слушай, скажи а как ты ассемблерный код проги получил? Я VC6 такой чтуки не нашел. У меня 2003, в 6-ке не помню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 15:16 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Дмитрий Иванович Gluk (Kazan) MSVC 2003 Без оптимизации: 00411A55 mov eax,dword ptr 00411A58 add eax,1 00411A5B mov dword ptr ,eax 00411A5E mov ecx,dword ptr 00411A61 add ecx,1 00411A64 mov dword ptr ,ecx 00411A67 mov edx,dword ptr 00411A6A add edx,dword ptr 00411A6D mov dword ptr ,edx Слушай, скажи а как ты ассемблерный код проги получил? Я VC6 такой чтуки не нашел. Во, держи: (VC6) 3: int i=5; 00401028 mov dword ptr [ebp-4],5 4: i = ++i + ++i; 0040102F mov eax,dword ptr [ebp-4] 00401032 add eax,1 00401035 mov dword ptr [ebp-4],eax 00401038 mov ecx,dword ptr [ebp-4] 0040103B add ecx,1 0040103E mov dword ptr [ebp-4],ecx 00401041 mov edx,dword ptr [ebp-4] 00401044 add edx,dword ptr [ebp-4] 00401047 mov dword ptr [ebp-4],edx 5: } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 17:09 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
nik_x Дмитрий Иванович Gluk (Kazan) MSVC 2003 Без оптимизации: 00411A55 mov eax,dword ptr 00411A58 add eax,1 00411A5B mov dword ptr ,eax 00411A5E mov ecx,dword ptr 00411A61 add ecx,1 00411A64 mov dword ptr ,ecx 00411A67 mov edx,dword ptr 00411A6A add edx,dword ptr 00411A6D mov dword ptr ,edx Слушай, скажи а как ты ассемблерный код проги получил? Я VC6 такой чтуки не нашел. Во, держи: (VC6) 3: int i=5; 00401028 mov dword ptr [ebp-4],5 4: i = ++i + ++i; 0040102F mov eax,dword ptr [ebp-4] 00401032 add eax,1 00401035 mov dword ptr [ebp-4],eax 00401038 mov ecx,dword ptr [ebp-4] 0040103B add ecx,1 0040103E mov dword ptr [ebp-4],ecx 00401041 mov edx,dword ptr [ebp-4] 00401044 add edx,dword ptr [ebp-4] 00401047 mov dword ptr [ebp-4],edx 5: } За код спасибо. Но расскажи как смотреть асемблерный код? Для этого надо дизасемблировать или получения такого кода предусмотрено в VS6. Если предусмотрено то как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2007, 06:17 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Build -> Set Active Configuration -> ... Debug Расставляешь Break Points <F9> <F5> На панели долбагера жмешь педаль Disassembly Вообще-то это всё в букварях описано... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2007, 17:21 |
|
||
|
++i + ++i
|
|||
|---|---|---|---|
|
#18+
Можно просто в настройках проекта поставить генерацию asm файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2007, 00:00 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2028842]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 575ms |

| 0 / 0 |
