Pull to refresh

Comments 58

жесть, мало того что люди путаются в пост и пре инкрементах, теперь ещё и головастики…
и да код стал ГОРАЗДО понятнее
Ужас какой. Так бы и то было лучше: "~-y, ~+y". Но все равно, сам лично это в жизни не напишу.
Там есть комменты, почему ~+ не сработает, посмотрите саму статью в блоге.
Думаю, что если приживуться, то название у них будет одно — операторы-сперматозоиды
Поклонники Оберона негодуют!
Что-то поздно для первого апреля.
~-y и -~y — валидный С/С++ код, теперь эти выражения будут иметь другое значение?.. А, ок, я понял, значение то же самое.
Я на всякий случай обращу внимание на два факта:
  1. Эти операторы работают во многих современных компиляторах Си++, а не только в Visual C++
  2. Внимательно читаем теги статьи
На самом деле зря про дефайн написал. Всем ясно, что дополнительный синтаксический сахар (если бы он был) не включается дефайнами )
А, ну да. Вместо непонятного и сложного (y+1) теперь простой и понятный -~y.
Вообще-то хороший пост для первого апреля:)
Данные операторы работают в любом компиляторе С++, даже в самом древнем, и основаны на том что операторы смены знака и битовой инверсии, записанные друг за другом, дают именно такой эффект — увеличение или уменьшение числа на единицу (в зависимости от порядка следования).
А самое главное, что компилятор понимает этот трюк и оптимизирует его:
0000000000000000 <f>:
   0:	8d 47 01             	lea    0x1(%rdi),%eax

0000000000000010 <g>:
  10:	8d 47 ff             	lea    -0x1(%rdi),%eax
Они на самом деле не кроссплатформенные, так как работают только на числах в дополнительном коде.
А реально приходилось работать на архитектурах, где это не так? Вопрос без подкола, просто интересно, ибо я о таких не знаю.
Про машины с числами в обратном коде я знаю только про UNIVAC, но стандарт явно отказывается от указания способа представления числа со знаком, так что гарантировать их работу нельзя.
Ждём Emoji в качестве операторов.
уже сегодня в C++ можно писать
int с[:>={
  0
};

Справа от слова int стоит улыбающийся человечек в шапке с помпоном.
От создателей оператора приближения к нулю (x --> 0), операторы-головастики. Уже сегодня в любой версии любого компилятора. Попробуйте и вы!
Вообще, большой простор, не только для C. Вот для bash отличный touch: ( • )( • )ԅ(‾⌣‾ԅ)
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ: ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) — (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) — (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) — (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) — (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) — (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) — (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

исполняемый JavaScript, например
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
(╯°益°)╯彡┻━┻
Throw Exception.

Мои глаза мне говорят что скорее это оператор DROP TABLE из мира SQL.
Изначально да, но он и здесь неплохо смотрится.
Новые затейливые вопросы на собеседованиях!

-~~-3+-~~--~~--~~-2


Синтаксический порошок какой-то
А вопрос — «угадайте язык».
Что интересно, выражение скорее всего валидно только в придуманной авторе версии C++ где "-~" это самостоятельный оператор, а не два.
Яваскрипт, который вполне себе умеет и -~ и ~- конструкцию -~~--~~-2 не осиливает
«Теперь вы можете Brainfuck прямо в C».
%натурально поперхнулся чаем%
В C++ можно было и раньше, интерпретатор на шаблонах пишется на коленке. Правда, отжирает по паре гигабайт памяти на мало-мальски сложных программах, но, право же, это такая мелочь по сравнению с улучшенной читабельностью.

А теперь, когда у нас есть еще и user-defined literals…
Подобный трюк очень подробно описывается в книге Ч. Петцольда «Код». Вернее, не как трюк, а как единственный разумный способ реализации разности в обычной системе записи (two’s complement) int-чисел.
Кстати, очень удобно, что оператор можно использовать многократно. Теперь записывать числа стало гораздо удобнее:

int x = -~-~-~-~-~0; // x = 5
UFO just landed and posted this here
Может быть всё же «123»[$]? :)
Черт!.. Черт!!! Совсем мозги закостенели.
Хотел написать простой пример, показывающий эквивалентность этих выражений, но что-то слишком увлекся…
#include <stdio.h>
int main()
{
	int O=0,$=-~O,_[]={(++O)--,-~O++[_],-~O++[_],-~++O++[_]};
	printf("%d%c%c%c%c%d",$[_],$<<_[_[_[$]]--],O=($<<-~_[O])+-~~-~_[$],O,(-~O+$[_])>>$,_[$]);
}
Вы мне монитор сломали. Кто ответит?
UFO just landed and posted this here
Да вообще этот синтаксис прекрасно работает и в других ЯП. Попробовал навскидку на JS, Java, PHP, везде выводит 5.
Хорошо, не будем. А C++ можно?
Я уж думал, вы тут расскажете про operator.(), а тут какая-то ересь :-)
Легко пропатчить старые версии студии и даже gcc — просто создайте и включите вот такой хедер
#ifndef __TADPOLE_H__
#define __TADPOLE_H__

template<class V> struct tadpole_minus {
  V v;
  tadpole_minus(V const& v) : v(v) {}
  V operator ~ () const { return v; }
};
template<class V> struct tadpole_tilde {
  V v;
  tadpole_tilde(V const& v) : v(v) {}
  V operator - () const { return v; }
};

template<class V> tadpole_minus<V> operator - (V v) { return (--v); };
template<class V> tadpole_tilde<V> operator ~ (V v) { return (++v); };

#endif // __TADPOLE_H__

Пример
#include <iostream>
#include <string>
#include "tadpole.h"

int main() {
  std::string s = "alpha";
  std::string::iterator i = s.begin() + 2;
  // теперь у итератора есть операторы "головастик туда" и "головастик сюда"
  std::cout << *~-~-i << *~-i << *i << *-~i << *-~-~i << std::endl;
  return 0;
}
Sign up to leave a comment.

Articles