Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Я даже после того, как увидел тот комментарий, захотел написать свой интерпретатор. Сделать ВМ с операторами +, ++, -, --, <, >, <<, >>, [], ввод-вывод как-то обозначить, ввести символ _, который обозначает экземпляр списка команд, копит команды и используется в качестве второго операнда там, где нужен второй операнд.
При отсутствии лени можно было бы сделать одновременно и то, и другое. Интересно было бы реализовать случай, когда опереции выполняются по порядку слева направо, от префиксных до постфиксных (впрочем, если без круглых скобок и хотя бы с одним постфиксным, легко: встретилась постфиксная - значит префиксные кончились, можно выполнять).
> приоритет
Не приоритет, а ленивость. Штатный оператор не считает правый операнд, если левого достаточно для ответа. А у перегруженного всегда вычисляются оба и только потом оператор получает управление.
Поэтому inkanus-gray и выглядит таким умным. Он всё же запомнил десять интересных фактов и теперь постоянно пишет их в случайном порядке время от времени как только мы их забудем.
В С++17 туда могут таки вставить точку следования, что полностью пофиксит перегрузку запятой и часть проблем с перегрузками логических операторов.
И я где-то видел предложение, если корутины добавят, в лучших традициях многозначности ключевых слов юзать await в перегрузках операторов для ленивого вычисления операндов.
В перегрузке логических операторов то какие проблемы? Ты всё равно перегружаешь их для собственных, а не встроенных типов... Или перегружаешь операторы преобразования типов
А какие проблемы с запятой? Всё те же: отсутствие точки следования, отсутствие ленивости.
Кстати в С++ и method chaining не всегда рекомендуется использовать, так как можно нарваться на UB. Поэтому одно из достаточно популярных предложений — добавить точки следования в перегрузки некоторых операторов и между вызовами методов.
один из краеугольных камней любой фичи в С++ это
"мы сделали новую модную фичу Х*" * нехуй пользоваться фичей Х когда Венера с Луной в разных фазах. мы вас предупреждали
А может дело не в C++, может дело в фичах?
Яркие примеры - GC и риалтайм, неявные касты и нетривиальные выражения, рекурсия и переполнение, ленивость и императивный подход.
Выходит, надо редуцировать набор фич до тех пор, пока их и вовсе не станет. Что на эту тему говорит Ваш внутренний Дзенский?
6.5.3.1/2: The expression ++E is equivalent to (E+=1).
6.5.16/4: If an attempt is made to modify the result of an assignment operator or to access it after the next sequence point, the behavior is undefined.
"Хорошо смеётся тот, кто смеётся последним", - подумал компилятор, и вставил в код rm -rf.
З.Ы. Он же, вроде как, имеет право сначала взять значение i на вход всех инкрементов, потом сделать все инкременты, а потом сложить их результаты в i...
Про 2 присваивания в одну переменную в одном выражении - всех. Просто не надо так делать. Тогда не придётся разбираться во всех этих тонкостях с сиквенс поинтами...
Бля, не в той pdf'ке читал... Это из сишного стандарта было. И там строчкой выше - результат присваивания не является lvalue.
Плюсы: require a modifiable lvalue as their left operand and return an lvalue with the type and value of the left operand after the assignment has taken place.
как раз из-за того, что ++ возвращает референс на измененную переменную, ub быть не должно. По факту, ++++i это ++(++i), где (++i) вернет &i только после того как i увеличится.
http://ideone.com/Dz4HTS
Например:
+ и - декремент/инкремент ячейки
++ и -- декремент/инкремент указателя
& и * ввод и вывод
~ и ! образуют цикл
Жалко, что пробелы придётся писать и квадратные скобочки уже не заюзать...
https://ideone.com/sGPtvn
Не приоритет, а ленивость. Штатный оператор не считает правый операнд, если левого достаточно для ответа. А у перегруженного всегда вычисляются оба и только потом оператор получает управление.
Указатель не разыменовывается, потому что && не будет считать второй аргумент если первый false
И я где-то видел предложение, если корутины добавят, в лучших традициях многозначности ключевых слов юзать await в перегрузках операторов для ленивого вычисления операндов.
ffffffuuuu~
Я всегда знал что перегрузка (синтаксический сахар над вызовами методов) опасна.
Годный камень в огород крестоблядей.
А камни кидать погоди, пока точку не разрешат перегружать. Вот тогда можно оторваться.
Кстати в С++ и method chaining не всегда рекомендуется использовать, так как можно нарваться на UB. Поэтому одно из достаточно популярных предложений — добавить точки следования в перегрузки некоторых операторов и между вызовами методов.
Где в method chaining может быть UB? Референс на вызывающий объект вернется только после выполнения функции
Не отработает как надо
Вот собственно бумага: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r1.pdf
находит все порно на жестком?
"мы сделали новую модную фичу Х*"
* нехуй пользоваться фичей Х когда Венера с Луной в разных фазах. мы вас предупреждали
Яркие примеры - GC и риалтайм, неявные касты и нетривиальные выражения, рекурсия и переполнение, ленивость и императивный подход.
Выходит, надо редуцировать набор фич до тех пор, пока их и вовсе не станет. Что на эту тему говорит Ваш внутренний Дзенский?
"мы добавили новое модное расширение к языку*"
*но даже авторы не знают всех его подводных камней
g: c++ user-defined literals
> ++++++i;
Одно слово: кресты.
Пойди себя и прибей.
6.5.16/4: If an attempt is made to modify the result of an assignment operator or to access it after the next sequence point, the behavior is undefined.
Хе-хе.
Какая разница что первым выполнится, ++i, или ++i.
З.Ы. Он же, вроде как, имеет право сначала взять значение i на вход всех инкрементов, потом сделать все инкременты, а потом сложить их результаты в i...
(a *= 7) %= 2;
(a+=1)+=1
и на втором присвоении сишка тебя нахуй пошлет потому что левая честь не пременная
а вообще должно развернуться в
(a = a + 1) = (a = a + 1) + 1
а тут уже UB
Борманд, моргни если я прав
Да. А вот у крестов там почему-то lvalue решили сделать.
Имхо, лучший вариант в питоне - операторы присваивания не возвращают результатов.
Плюсы: require a modifiable lvalue as their left operand and return an lvalue with the type and value of the left operand after the assignment has taken place.
Хотя... after the assignment has taken place...
Хуй знает, короче. Я бы не стал рисковать.
++++1
эквивалентно
(a = a + 1) = (a = a + 1) + 1
а тут уже UB ибо может оказаться, что а увеличится на 3