![]() |
![]() |
◄ 1 2 |
О жизни...
:: Математика и алгоритмы
|
|
| ||||||||||||||||||
ambrozii-fadeevich-s 02.08.19 - 13:48 |
Смотрю - пошла мода на нестандартные вычисления. У кого сколько получится: int i = 5; i = ++i + ++i; | ||||||||||||||||||
Глок 17 101 - 02.08.19 - 18:46 | |||||||||||||||||||
Глок 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 | |||||||||||||||||||
Глок 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 | |||||||||||||||||||
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 | |||||||||||||||||||
Провинциальный 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 | |||||||||||||||||||
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 |
Список тем форума |
Правила | Описание | Реклама на форуме | Волшебные решения | Поиск | Секции | Рейтинг | Книга знаний | Вики-миста (КЗ2) | Мобильная | Архив | Модераторы | Галерея | Регистрация | 18+ |