powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ++i + ++i
42 сообщений из 42, показаны все 2 страниц
++i + ++i
    #34518328
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется код:
Код: plaintext
1.
2.
int i =  5 ;
i = ++i + ++i;

Чему будет равно i в результате?
...
Рейтинг: 0 / 0
++i + ++i
    #34518361
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В с++ 14)) В c# 13
...
Рейтинг: 0 / 0
++i + ++i
    #34518369
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceВ с++ 14
Но почему 14???????
...
Рейтинг: 0 / 0
++i + ++i
    #34518380
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун TopSpaceВ с++ 14
Но почему 14???????

Сначала прединкременты, потом сложение.

Эта тема подробно разбиралась, где-то пол года назад.
...
Рейтинг: 0 / 0
++i + ++i
    #34518388
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну хорошо, чуть усложним вариант:
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Чему должно быть равно a и b?
...
Рейтинг: 0 / 0
++i + ++i
    #34518452
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунНу хорошо, чуть усложним вариант:
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Чему должно быть равно a и b?

С какой целью вы интересуетесь?
...
Рейтинг: 0 / 0
++i + ++i
    #34518458
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Не проверяя, думаю i=9
14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается)
...
Рейтинг: 0 / 0
++i + ++i
    #34518466
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Александр ГoлдунНу хорошо, чуть усложним вариант:
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Чему должно быть равно a и b?

С какой целью вы интересуетесь?
Да в общем-то ни с какой. Давно уже не брал в руки С++, хотя когда-то весьма активно его использовал. И тут спросили по ICQ. С ходу ответил одно, скомпилял, проверил - получил другое. Смутило.
...
Рейтинг: 0 / 0
++i + ++i
    #34518478
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Не проверяя, думаю i=9
14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается)


Проверил == 11.

У меня логика не основывается на областях памяти:

Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5.
...
Рейтинг: 0 / 0
++i + ++i
    #34518479
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Не проверяя, думаю i=9

10. При этом a=5, b=5 получилось.
C++ Builder 6
...
Рейтинг: 0 / 0
++i + ++i
    #34518492
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун Akh Александр ГoлдунНу хорошо, чуть усложним вариант:
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Чему должно быть равно a и b?

С какой целью вы интересуетесь?
Да в общем-то ни с какой. Давно уже не брал в руки С++, хотя когда-то весьма активно его использовал. И тут спросили по ICQ. С ходу ответил одно, скомпилял, проверил - получил другое. Смутило.

Если интересна тема, то можете поискать эту ветку. Даже разбирали asm для выяснения обстаятельств. В чем-то даже разобрались.

Но эта тонкая материя, нет необходимости заморачиваться по этому поводу.
...
Рейтинг: 0 / 0
++i + ++i
    #34518517
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh
Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5.

так а почему 5?
...
Рейтинг: 0 / 0
++i + ++i
    #34518530
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace Akh
Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5.

так а почему 5?

Потом декремент вернул i значение 5-ти:
Код: plaintext
1.
2.
3.
i =  5 ;
++i =  6 ; //a
--i =  5 ; //b
        11 
...
Рейтинг: 0 / 0
++i + ++i
    #34518541
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh TopSpace
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Не проверяя, думаю i=9
14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается)


Проверил == 11.

У меня логика не основывается на областях памяти:

Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5.
В каком компиляторе? C++Builder 6 выдал i=10, a=5, b=5
...
Рейтинг: 0 / 0
++i + ++i
    #34518548
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh TopSpace Akh
Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5.

так а почему 5?

Потом декремент вернул i значение 5-ти:
Код: plaintext
1.
2.
3.
i =  5 ;
++i =  6 ; //a
--i =  5 ; //b
        11 


Разве приоритет не справа на лево (например сцепки операторов <<)??
Тогда
Код: plaintext
1.
2.
3.
i =  5 ;
--i =  4 ; //b
++i =  5 ; //a
 9 
...
Рейтинг: 0 / 0
++i + ++i
    #34518550
батрачище
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TopSpaceВ с++ 14)) В c# 13

а почему в С# 13 ???
...
Рейтинг: 0 / 0
++i + ++i
    #34518556
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун Akh TopSpace
Код: plaintext
1.
2.
3.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
Не проверяя, думаю i=9
14 из-за того, что после инкрементов правый операнд сложения - область памяти обозначенная как переменная i. Которая претерпела 2 инкремента. Т.е. не создается временный объект под результат (хотя было бы логичней, в .net создается)


Проверил == 11.

У меня логика не основывается на областях памяти:

Скобки самые приоритетные, поэтому инкременты разделились во времени. Получилось 6+5.
В каком компиляторе? C++Builder 6 выдал i=10, a=5, b=5

gcc
...
Рейтинг: 0 / 0
++i + ++i
    #34518567
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
батрачище TopSpaceВ с++ 14)) В c# 13

а почему в С# 13 ???
Потому что при вычислении ++i создается новый объект, который при втором ++i не трогается, и участвует в сложении.
...
Рейтинг: 0 / 0
++i + ++i
    #34518568
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh

Если интересна тема, то можете поискать эту ветку. Даже разбирали asm для выяснения обстаятельств. В чем-то даже разобрались.

Тема любопытна. Я догадывался, что это, возможно, обсуждалось, и может не один раз. Но найти не удалось. Ключевые слова не подскажете?
Akh
Но эта тонкая материя, нет необходимости заморачиваться по этому поводу.
В принципе да. За такой код в продакшн надо гнать в шею. Сомневаешься - упрости.
...
Рейтинг: 0 / 0
++i + ++i
    #34518574
батрачище
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TopSpace батрачище TopSpaceВ с++ 14)) В c# 13

а почему в С# 13 ???
Потому что при вычислении ++i создается новый объект, который при втором ++i не трогается, и участвует в сложении.

какой гемор!..
...
Рейтинг: 0 / 0
++i + ++i
    #34518581
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace[quot Akh]
Разве приоритет не справа на лево (например сцепки операторов <<)??
Тогда
Код: plaintext
1.
2.
3.
i =  5 ;
--i =  4 ; //b
++i =  5 ; //a
 9 


Может и справа налево. Тогда логика какая-то другая.

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

Таким образом, исследование подобного вопроса, может представлять интерес чисто научный для конкретного компилятора. Можно будет даже выдвинуть теорию, как в таких случаях ведет себя компилятор. Для текущей версии, для текущей оптимизации.

Так что, к изучению с/с++, это исследование не имеет ни какого отношения.
...
Рейтинг: 0 / 0
++i + ++i
    #34518587
батрачище
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a
Код: plaintext
1.
int i =  5 ;
i = i++ + i++;
чему в C# будет i равно ?
...
Рейтинг: 0 / 0
++i + ++i
    #34518621
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГoлдунТема любопытна. Я догадывался, что это, возможно, обсуждалось, и может не один раз. Но найти не удалось. Ключевые слова не подскажете?


++i или i++?
Префиксные операции и стандарт
...
Рейтинг: 0 / 0
++i + ++i
    #34518725
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
батрачищеa
Код: plaintext
1.
int i =  5 ;
i = i++ + i++;
чему в C# будет i равно ?

Код: plaintext
1.
2.
3.
4.
int i =  5 ;
i = i++ + i++;
MessageBox.Show( i.ToString() );
//11
Гм.. понимайте как хотите:))
...
Рейтинг: 0 / 0
++i + ++i
    #34518829
Pavel Kilevatyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://bash.org.ru/quote.php?num=212679
...
Рейтинг: 0 / 0
++i + ++i
    #34518861
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java1.5:

Код: plaintext
1.
2.
int i =  5 ;
i = ++i + ++i;
13

Код: plaintext
1.
2.
int i =  5 ;
int a,b;
i = (a=++i)+(b=--i);
11

Код: plaintext
1.
int i =  5 ;
i = i++ + i++;
11

забавная тема :)
...
Рейтинг: 0 / 0
++i + ++i
    #34519290
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну орлы, еще дедушки Корнеган и Ричи завещали так не делать, это раз. Вот вторых тест некорректный - нормальный компилер (во всяком случае gcc) все должен был еще на этапе компиляции вычислить...
...
Рейтинг: 0 / 0
++i + ++i
    #34519328
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНу орлы, еще дедушки Корнеган и Ричи завещали так не делать, это раз. Вот вторых тест некорректный - нормальный компилер (во всяком случае gcc) все должен был еще на этапе компиляции вычислить...

gcc 3.3.3 нормальный, вроде, но ему по барабану. Считает по своему и доволен.
...
Рейтинг: 0 / 0
++i + ++i
    #34519429
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-е аналогично
...
Рейтинг: 0 / 0
++i + ++i
    #34519771
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун пишет:
> Автор: "Александр Гoлдун"
> Имеется код:
>
> int i = *5*;
> i = ++i + ++i;
>
>
> Чему будет равно i в результате?

Будет равно Undefined Behaviour.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
++i + ++i
    #34519780
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это выражение пример неопределенного поведения. Вы пытаетесь изменить одну и туже переменную и между этими изменениями нет ни одной точки следования. Здесь, в принципе, компилятор имеет право отформатировать ваш винчестер, а вы гадаете чему оно равно :)
...
Рейтинг: 0 / 0
++i + ++i
    #34519801
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун пишет:
> i = ++i + ++i;
> Чему будет равно i в результате?

Вообще, ребята, мы тут дружно решили, прочитав ветку,
что иногда лучше жевать, чем писать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
++i + ++i
    #34519913
Фотография Insane Pooh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Г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
...
Рейтинг: 0 / 0
++i + ++i
    #34532857
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 такой чтуки не нашел.
...
Рейтинг: 0 / 0
++i + ++i
    #34532867
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Иванович 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.
...
Рейтинг: 0 / 0
++i + ++i
    #34532879
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Ивановичкак ты ассемблерный код проги получил?у нас в бормановских средах, если есть хотя бы один asm, то генерится ассемблерный файлик, который уже потом компилится
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
++i + ++i
    #34532889
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Иванович 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-ке не помню
...
Рейтинг: 0 / 0
++i + ++i
    #34533380
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: }
...
Рейтинг: 0 / 0
++i + ++i
    #34534300
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. Если предусмотрено то как?
...
Рейтинг: 0 / 0
++i + ++i
    #34536557
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Build -> Set Active Configuration -> ... Debug
Расставляешь Break Points <F9>
<F5>
На панели долбагера жмешь педаль Disassembly


Вообще-то это всё в букварях описано...
...
Рейтинг: 0 / 0
++i + ++i
    #34537110
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно просто в настройках проекта поставить генерацию asm файла.
...
Рейтинг: 0 / 0
++i + ++i
    #34538644
nik_x и daevaorn спасибо вам.
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / ++i + ++i
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]