На всякий случай сохронил
там должна быть капча с картинками
с QR кодами
int i = 5;
i = ++i + ++i;
i = ++i + ++i;
твоё место за решеткой!
i += ++i++ + ++i++;
человек, который способен использовать такое в реальной жизни, при этом не иднус, а осознанно готовый к любым последствиям, достоит валгаллы (вариант, что он умрёт не насильственной смертью мы не рассматриваем в виду малых шансов)
В реальной жизни такое не нужно.
Так что достоин он максимум хороших таких пизюлей за нечитабельность кода.
Так что достоин он максимум хороших таких пизюлей за нечитабельность кода.
Он даже пиздюлей не получит, так как код не работает.
i = 13 ?
Хотя не, 14
13 всё же правильно:
int i = 5;
i = ++i + ++i;
13 = 6 + 7
int i = 5;
i = ++i + ++i;
13 = 6 + 7
Если не ошибаюсь первым идут операторы ++, потом операторы сложения. Т.е. сначала, 2 раза ++, т.е. i =7 и потом i+i, т.е. 14
Это зависит от языка, коимпилятора, фазы луны...
Копипаста с лурка
"В данном примере происходит неоднократное изменение переменной в пределах одной точки следования, такая ситуация описывается в стандартах C и С++ как UB. Иными словами, даже попытки ответить на этот вопрос иначе как «UB» демонстрируют недостаточную квалификацию отвечающего. Другое дело, что после «UB» можно указать некоторые подробности, и мы этим займёмся, поскольку не утоленное вовремя любопытство приводит к драмам в обсуждении.
Конкретно неопределённость в этой, как некоторым кажется, кристально ясной конструкции в данном случае заключается в том, что, согласно стандартам С и С++, побочные эффекты (то есть инкремент в данном случае) могут быть применены в любой удобный для компилятора момент между двумя точками следования. Конструкцию i = ++i + ++i; компилятор вправе понять и как
tmp=i; tmp++; i = tmp; tmp++; i += tmp;
и как
tmp=i; tmp++; tmp++; i = tmp + tmp;
и какими-нибудь другими способами. Нужна такая свобода для проведения низкоуровневых оптимизаций в обычных случаях типа a = ++b + ++c;, дабы между делом сэкономить пару тактов на халяву.
Хотя, оптимизатор тут вообще не при чём. Дело в том, что наше интуитивное понимание работы этого кода основывается на том, что прединкремент возвращает значение, получившееся после прибавления единицы. На самом же деле любой нормальный прединкремент возвращает не получившееся значение, а ссылку на эту же переменную. Поэтому мы складываем не числа, а две одинаковые ссылки, то есть переменную i саму с собой! Иными словами происходит буквально следующее:
1. Левый ++i прибавляет единицу к i и возвращает ссылку на неё. I = 6.
2. Правый ++i прибавляет ещё одну единицу к i и также возвращает ссылку на неё. I = 7.
3. Оператор сложения разыменовывает ссылки, получая i = i + i. Так как после второго шага I = 7, то извлекается именно это число, давая выражение i = 7 + 7, откуда и получается 14."
Копипаста с лурка
"В данном примере происходит неоднократное изменение переменной в пределах одной точки следования, такая ситуация описывается в стандартах C и С++ как UB. Иными словами, даже попытки ответить на этот вопрос иначе как «UB» демонстрируют недостаточную квалификацию отвечающего. Другое дело, что после «UB» можно указать некоторые подробности, и мы этим займёмся, поскольку не утоленное вовремя любопытство приводит к драмам в обсуждении.
Конкретно неопределённость в этой, как некоторым кажется, кристально ясной конструкции в данном случае заключается в том, что, согласно стандартам С и С++, побочные эффекты (то есть инкремент в данном случае) могут быть применены в любой удобный для компилятора момент между двумя точками следования. Конструкцию i = ++i + ++i; компилятор вправе понять и как
tmp=i; tmp++; i = tmp; tmp++; i += tmp;
и как
tmp=i; tmp++; tmp++; i = tmp + tmp;
и какими-нибудь другими способами. Нужна такая свобода для проведения низкоуровневых оптимизаций в обычных случаях типа a = ++b + ++c;, дабы между делом сэкономить пару тактов на халяву.
Хотя, оптимизатор тут вообще не при чём. Дело в том, что наше интуитивное понимание работы этого кода основывается на том, что прединкремент возвращает значение, получившееся после прибавления единицы. На самом же деле любой нормальный прединкремент возвращает не получившееся значение, а ссылку на эту же переменную. Поэтому мы складываем не числа, а две одинаковые ссылки, то есть переменную i саму с собой! Иными словами происходит буквально следующее:
1. Левый ++i прибавляет единицу к i и возвращает ссылку на неё. I = 6.
2. Правый ++i прибавляет ещё одну единицу к i и также возвращает ссылку на неё. I = 7.
3. Оператор сложения разыменовывает ссылки, получая i = i + i. Так как после второго шага I = 7, то извлекается именно это число, давая выражение i = 7 + 7, откуда и получается 14."
> даже попытки ответить на этот вопрос иначе как «UB» демонстрируют недостаточную квалификацию отвечающего
Расходимся, роботов среди нас не нашлось...
Расходимся, роботов среди нас не нашлось...
Язык СИ компилятор gcc, linux ubunta 20.04 64 бит процессор Intel® Core™ i7-10850H CPU @ 2.70GHz × 12
#include
int main ( void )
{
unsigned int i = 1;
i += ++i + ++i;
printf ( "I = %u", i);
return 0;
}
I = 9
Все то же самое, только тип меняем на unsigned char:
#include
int main ( void )
{
unsigned char i = 1;
i += ++i + ++i;
printf ( "I = %u", i);
return 0;
}
I = 8
знатоки помогайте
#include
int main ( void )
{
unsigned int i = 1;
i += ++i + ++i;
printf ( "I = %u", i);
return 0;
}
I = 9
Все то же самое, только тип меняем на unsigned char:
#include
int main ( void )
{
unsigned char i = 1;
i += ++i + ++i;
printf ( "I = %u", i);
return 0;
}
I = 8
знатоки помогайте
Помоги себе сам - декомпиль, и посмотри, что там компилятор нагенерил.
И перестань использовать UB в коде.
И перестань использовать UB в коде.
И что тебя смущает? Ты мог получить ответ 42 и это все равно был бы верный ответ, полностью соответствующий спецификации.
Зависит от реализации языка(если там есть такая конструкция) и для С - от компилятора. Тащемта, суть в том, сохраняется ли значение первого аргумента где-то в регистре после его вычисления, или же используется то же, что и во втором.
Обычно - сохраняется, и будет 13. Но это не точно.
Обычно - сохраняется, и будет 13. Но это не точно.
А если сделать так, то станет ещё интереснее.
int i = 5;
i = ++i + ++i + ++i;
int i = 5;
i = ++i + ++i + ++i;
Это способ затеять войну между роботами с прошивкой на разных языках, да?
А почему там четвёрка ста квадриллионная? Как допустимая погрешность при расчёте или что? Кэп, помоги.
Годный канал. Спасибо
Я только вчера этот канал нашла и сегодня вижу на джое. Дурацкий феномен Баадера-Майнхоф
Я только вчера узнал про феномен Баадера-Майнхоф, ёбаный насос
Предлагаю всем вместе собраться и попросить вывести нас из симуляции наконец
Смотри
Ты же в курсе что компы все считают в двоичной системе. Тип 0 = 0, 1 = 1, 2 = 10, 3 = 11, 4 = 100 и тд.
Тут начинается проблема с дробями. 1/2, 1/4 -- это норм, это можно без проблем записать в двоичной системе. А вот когда доходит до 1/10 тут вылезает проблемма, тк мы привыкли считать в десятичной системе и делить соответственно тоже. А там из-за того что комп не может нормально делить на 5, 3, 7 и тд вылазит вот такая незаметная доля.
Сразу прошу прощения за неточности, пытался простым языком объяснить
Вот ссылка если хочется глубже в тему:
https://betterprogramming.pub/why-is-0-1-0-2-not-equal-to-0-3-in-most-programming-languages-99432310d476
Ты же в курсе что компы все считают в двоичной системе. Тип 0 = 0, 1 = 1, 2 = 10, 3 = 11, 4 = 100 и тд.
Тут начинается проблема с дробями. 1/2, 1/4 -- это норм, это можно без проблем записать в двоичной системе. А вот когда доходит до 1/10 тут вылезает проблемма, тк мы привыкли считать в десятичной системе и делить соответственно тоже. А там из-за того что комп не может нормально делить на 5, 3, 7 и тд вылазит вот такая незаметная доля.
Сразу прошу прощения за неточности, пытался простым языком объяснить
Вот ссылка если хочется глубже в тему:
https://betterprogramming.pub/why-is-0-1-0-2-not-equal-to-0-3-in-most-programming-languages-99432310d476
иди дальше, человек
там должно быть 2 картинки и задача сгенерировать из них 3ю
нарисуй
Квантовый робот?
А потом потребуют изуродовать точнейшее вычисление и обрезать до двух знаков после запятой.
Ну так правильно, ибо точнейшее вычисление почти никому не нужно.
Приколы для калькуляторов с не знанием типа decimal
это что то на программерском?
Ага, другая капча это:
float i = 2.0;
bool b = (i - 1.0) == 1;
выберите правильный ответ: b = true / false
float i = 2.0;
bool b = (i - 1.0) == 1;
выберите правильный ответ: b = true / false
ошибка компиляции
Ну да, нужно явное приведение. А так на удивление выдало true. Думал, что будет false из-за мусора после запятой
А я не въехал, откуда там хуй десятых взялся?
Дроби в машинном представлении не десятичные, а двоичные. При преобразовании в десятичную появляется ошибка, которая иногда скрывается операторами вывода, иногда нет.
особенности хранения дробных чисел в памяти компьютера.
реактор познавательный
Если я ещё что-то помню и понимаю в принципиальных схемах, то это какой-то передатчик. Правда ооооочень корявый и абсолютно не рабочий. Транзистор в обрыве, колебательный контур вообще гдето в воздухе, вместо микрофона розетка IR(?) да и остальное непонятно как и зачем.
Понятно что художник рисовал что-то рандомное с рандомной схемы по принципу "лишь бы было похоже", но что-то смутно похожее на передатчик угадывается.
Понятно что художник рисовал что-то рандомное с рандомной схемы по принципу "лишь бы было похоже", но что-то смутно похожее на передатчик угадывается.
Судя по наличию в сериале шуток для физиков, знатоков теории относительности, почитателей НФ, и прочих, это тоже была неплохая шутка.
Чтобы написать коммент, необходимо залогиниться