Вход | Регистрация
    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

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