Вход | Регистрация
    1  2
О жизни... :: Математика и алгоритмы

OFF: У кого сколько получится: int i = 5; i = ++i + ++i;

↓ [Asmody, 04.08.19 - 21:23]
OFF: У кого сколько получится: int i = 5; i = ++i + ++i;
Я
   ambrozii-fadeevich-s
 
02.08.19 - 13:48
3. 1444% (7)
2. 1331% (5)
6. Другое19% (3)
5. 166% (1)
1. 120% (0)
4. 150% (0)
Всего мнений: 16

Смотрю - пошла мода на нестандартные вычисления. У кого сколько получится: int i = 5; i = ++i + ++i;
 
 
   Глок 17
 
101 - 02.08.19 - 18:46
(100) не все, а только криворукие.

Выражение (0) нужно упростить для однозначности, чтобы даже v77 было понятно:

i = 5;
++i;
a2 = i;
++i;
a2 = i;
i = a1 + a2;
   Глок 17
 
102 - 02.08.19 - 18:47
Опечатка, в первом присвоении a1 вместо а2
   Глок 17
 
103 - 02.08.19 - 18:48
Если выражение вызывает непонятки, его всегда нужно раскладывать. Тогда ошибок будет меньше
   v77
 
104 - 02.08.19 - 18:49
(101) Криворукие это компиляторы GCC, Microsoft и Clang, я так понимаю. А какие тогда правильные компиляторы?
   Глок 17
 
105 - 02.08.19 - 18:49
(104) Там где результат 13
   NorthWind
 
106 - 02.08.19 - 18:58
(105) неверно ты разложил. Подвох в том, что сначала по правилам приоритета выполняются все i++, и только потом происходит сложение. В результате складывается не 7 и 6, а 7 и 7. А если сделать ++i + ++i + ++i, то будет уже 8 + 8 + 8 = 24... ну и так далее.
   Глок 17
 
107 - 02.08.19 - 19:02
(106) Ну и откуда у тебя в первом слагаемом 7, если сначала мы получаем 6? Во втором получаем 7. Затем по логике мы должны сложить результаты предыдущих вычислений, а не то что сейчас хранится в переменной i. Ты просто пытаещься подогнать логику под сишный компилятор, из-за чего она страдает.
   Глок 17
 
108 - 02.08.19 - 19:10
Вот аналог того что в (0):

(i = 6) + (i = 7)

Какой результат будет у этого бредового выражения?
   Глок 17
 
109 - 02.08.19 - 19:12
Из первых скобок выползет результат 6, из вторых выползет 7, затем они сложатся, получится 13. В i будет записано 7, но нам пофиг что там, потому что мы складываем не i + i, а результаты операций в скобках.
   NorthWind
 
110 - 02.08.19 - 19:35
(107) Нет. См. (35). Там пипец какая интересная табличка. Приоритетной операцией, причем с очень высоким приоритетом, являются прединкремент. Приоритет ВЫШЕ умножения и деления! Сначала, вперед всех остальных, в данном случае выполнятся они. Сколько их будет - столько и выполнятся. И только потом пойдет сложение уже над выполненными прединкрементами. Поэтому 7 + 7.
   v77
 
111 - 02.08.19 - 19:47
Надо определиться сначала о каком языке речь. В Java и C# будет 13. В Си будет 14
   ДенисЧ
 
112 - 03.08.19 - 20:39
   stopa85
 
113 - 03.08.19 - 20:59
С++ даст 14, а вот ява или си шарп 13.

3. 14
   Конструктор1С
 
114 - 04.08.19 - 11:41
(113) таки, а почему вы предлагаете ровняться на плюсы?
   Фрэнки
 
115 - 04.08.19 - 11:43
(114) скажу для поддержки разговора, что 1С платформа написана на С++ :-)
   NorthWind
 
116 - 04.08.19 - 18:30
(114) а таки, собственно, почему бы и нет?
   Глобальный_Поиск
 
117 - 04.08.19 - 20:01
Чё за дебильный код? Почему+++++++19 а нельзя написать +20, это кстати сэкономит байты.
   Глобальный_Поиск
 
118 - 04.08.19 - 20:02
Инкреметы они оптимизируют.ну и пишите на ассемблере тогда
   Глобальный_Поиск
 
119 - 04.08.19 - 20:07
Когда количество библиотек в миллионы раз превышает количество кода , играться плюсами и пузырьками это удел преподов на первом курсе.
   Глобальный_Поиск
 
120 - 04.08.19 - 20:09
Выдохнул :)
   stopa85
 
121 - 04.08.19 - 21:17
(114) не было бы плюсов, не было бы этой загадки. Она, кстати, очень важна для понимания языка.
   DrZombi
 
122 - 05.08.19 - 06:54
10 :)

6. Другое
   DrZombi
 
123 - 05.08.19 - 06:54
(117) Видимо автору языка, было так интересней извращаться :)
   DrZombi
 
124 - 05.08.19 - 06:55
+(122) Тут так то не описано, что за язык, что за математика...  :)
   Провинциальный 1сник
 
125 - 05.08.19 - 11:25
(110) При чем тут приоритет.. Даже со всеми приоритетами, когда мы выполняем сложение, мы по логике должны взять уже рассчитанный РАНЕЕ первый операнд (++i), а не пытаться его рассчитать ЕЩЕ РАЗ после второго(++i). И будет 13. Если компилятор С++ выдает 14 - это очередное подтверждение тезиса что Си - плохой язык.

2. 13
   bolobol
 
126 - 05.08.19 - 12:42
(125) Глупости, никаких "ещё раз" в примере нет. Есть две операции увеличения i _до_сложения.
   Провинциальный 1сник
 
127 - 05.08.19 - 13:33
(126) ++i - это инкремент переменной и одновременно возврат этого увеличенного значения в вызывающее выражение. То есть, если в выражении ++i встречается дважды, то и вычислено оно будет дважды.. сначала от исходного значения, потом от уже вычисленного. И только потом сложены эти промежуточные результаты. И получается 13. Вообще не понимаю, как может быть 14.
   Smile 8D
 
128 - 05.08.19 - 13:37
(106) Вы так уверенно рассуждаете, но выше в (46) уже написали, что ++i + ++i + ++i дает 22, а не 24, что можно проверить в компиляторе с++, на который так же давали выше ссылку. К сожалению, при 3х слагаемых правила уже работают по другому.
   Smile 8D
 
129 - 05.08.19 - 13:44
(127) Не забывайте, что ++i прибавляет и возвращает значение в выражение, а i++ сначала возвращает, а затем уже прибавляет. И ваш негатив в сторону языков, в которых это используется, вызван скорее непониманием зачем эти механизмы были придуманы. Естественно, что пример из загадки искусственный, а инкременты реально используются обычно при вызовах из разных процедур\потоков, где требуется использовать текущее значение и параллельно его изменить.
   Провинциальный 1сник
 
130 - 05.08.19 - 13:47
(129) Согласен, прибавляет и возвращает. Первый операнд 6 после инкремента, второй 7 после инкремента. Потом выполяем сложение. Получаем 6+7=13. Почему 14 то???
 
 Рекламное место пустует
   Smile 8D
 
131 - 05.08.19 - 13:51
(130) Ну про это уже выше написали, что приоритет у операции выше, чем у сложения, даже ссылку кидали. Вы же не возмущаетесь, что умножение выполняют раньше чем сложение.
А вот почему при 3х слагаемых логика меняется мне непонятно и не нравится)
   Провинциальный 1сник
 
132 - 05.08.19 - 13:56
(131) Так я не спорю о приоритетах! И рассуждаю именно в смысле того, что СНАЧАЛА делаем инкременты и возвращаем значения инкрементов, и только потом складываем. Но откуда 14?
   bolobol
 
133 - 05.08.19 - 14:03
(132) Ещё один "нечитатель". Ранее всё по полочкам разложено было неоднократно. И ладно когда тролль только зарегистрированный делает вид что не видит...
   Провинциальный 1сник
 
134 - 05.08.19 - 14:09
(133) Блин, ну ткните пальцем, ГДЕ разжовано? Читаю, вижу логичные предпосылки, потом бац - парадоксальный вывод.
   Провинциальный 1сник
 
135 - 05.08.19 - 14:10
+(134) Откуда берется семерка в первом операнде???
   bolobol
 
136 - 05.08.19 - 14:16
(135) в (46) и в (50) - двумя языками изложено
   Провинциальный 1сник
 
137 - 05.08.19 - 14:17
А, понял. Если строить дерево вычисления выражения по приоритетам, то будет именно 13. Но если считать сишным способом "инкремент записывается в одну и ту же ячейку памяти, и в результате к тому моменту когда надо сложить два слагаемых, складывается в реальности уже 7 и 7, а не 7 и 6", тогда понятно. Но блин, символ в одном месте выражения и в другом - это НЕ ОДНА ячейка памяти, а узел в дереве расчета. А тут получается "дерево-мутант". Си - плохой язык.
   bolobol
 
138 - 05.08.19 - 14:24
(137) Позволю себе не согласиться. Использование одной и той же переменной (й+й) не должно вызывать два чтения и два помещения в разные регистры для дальнейшего сложения. Именно из-за этого, программы на Си и работают в х100 раз быстрее альтернативно одарённых языков.
   Провинциальный 1сник
 
139 - 05.08.19 - 14:45
На лурке тема разжована, оказывается это древний баянище)
http://lurkmore.to/%2B%2Bi_%2B_%2B%2Bi
   Глок 17
 
140 - 05.08.19 - 17:35
(110) Ты не понял. Понятно что инкремент имеет высокий приоритет. Но почему ты продолжаешь складывать 7 + 7, если результаты инкоементов нам дали два слагаемых: 6 и 7?
   Глок 17
 
141 - 05.08.19 - 17:43
(138) >> Именно из-за этого, программы на Си и работают в х100 раз быстрее альтернативно одарённых языков.

Ага. Только выдают не тот результат, который нужен. Главное быстро :)))
   Глок 17
 
142 - 05.08.19 - 17:45
Чтобы выражение (0) правильно работало на Си, нужно его преобразовать:

int i = 5;
int tmp = ++i;
i = tmp + ++i;
   stopa85
 
143 - 07.08.19 - 19:16
(127) нет не правильно. В С++ операция ++i возвращает ссылку на объект (указатель на область памяти, где записано значение), а не копию объекта. Ты путаешь с java и c#.

Вот и получается, что по этому указателю в ОЗУ компьютера находится значение и увеличивается на 1. Потом оно находится еще раз и увеличивается на один еще раз. Потом складывается само с собой. Это нужно понимать. Это, что ли, философия языка.
   ambrozii-fadeevich-s
 
144 - 09.08.19 - 11:11
(139) Это намного древнее баянище.


(142)
   ambrozii-fadeevich-s
 
145 - 09.08.19 - 11:14
(142) Если правильно преобразовать, то получится не то, что ожидает среднестатистический интерпретатор
int i = 5;
++i;
++i;
i = i + i;
   ambrozii-fadeevich-s
 
146 - 09.08.19 - 11:15
пятница же!
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.