powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ++i + ++i
25 сообщений из 42, страница 1 из 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
25 сообщений из 42, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / ++i + ++i
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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