Comments 58
жесть, мало того что люди путаются в пост и пре инкрементах, теперь ещё и головастики…
и да код стал ГОРАЗДО понятнее
и да код стал ГОРАЗДО понятнее
Ужас какой. Так бы и то было лучше: "~-y, ~+y". Но все равно, сам лично это в жизни не напишу.
Думаю, что если приживуться, то название у них будет одно — операторы-сперматозоиды
Поклонники Оберона негодуют!
Что-то поздно для первого апреля.
~-y и -~y — валидный С/С++ код, теперь эти выражения будут иметь другое значение?.. А, ок, я понял, значение то же самое.
~-y и -~y — валидный С/С++ код, теперь эти выражения будут иметь другое значение?.. А, ок, я понял, значение то же самое.
Я на всякий случай обращу внимание на два факта:
- Эти операторы работают во многих современных компиляторах Си++, а не только в Visual C++
- Внимательно читаем теги статьи
А, ну да. Вместо непонятного и сложного (y+1) теперь простой и понятный -~y.
Вообще-то хороший пост для первого апреля:)
Данные операторы работают в любом компиляторе С++, даже в самом древнем, и основаны на том что операторы смены знака и битовой инверсии, записанные друг за другом, дают именно такой эффект — увеличение или уменьшение числа на единицу (в зависимости от порядка следования).
Данные операторы работают в любом компиляторе С++, даже в самом древнем, и основаны на том что операторы смены знака и битовой инверсии, записанные друг за другом, дают именно такой эффект — увеличение или уменьшение числа на единицу (в зависимости от порядка следования).
А самое главное, что компилятор понимает этот трюк и оптимизирует его:
0000000000000000 <f>:
0: 8d 47 01 lea 0x1(%rdi),%eax
0000000000000010 <g>:
10: 8d 47 ff lea -0x1(%rdi),%eax
Они на самом деле не кроссплатформенные, так как работают только на числах в дополнительном коде.
А реально приходилось работать на архитектурах, где это не так? Вопрос без подкола, просто интересно, ибо я о таких не знаю.
Ждём Emoji в качестве операторов.
От создателей оператора приближения к нулю (
x --> 0
), операторы-головастики. Уже сегодня в любой версии любого компилятора. Попробуйте и вы!(╯°益°)╯彡┻━┻
Throw Exception.
Throw Exception.
┬──┬ ノ(°—°ノ)
Catch
Catch
Вообще, большой простор, не только для 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, например
В owl-lisp ノ°—°ノ используется как оператор реверса. Пруф: github.com/aoh/owl-lisp/blob/master/owl/list.scm
(╯°益°)╯彡┻━┻
Throw Exception.
Мои глаза мне говорят что скорее это оператор DROP TABLE из мира SQL.
Новые затейливые вопросы на собеседованиях!
Синтаксический порошок какой-то
-~~-3+-~~--~~--~~-2
Синтаксический порошок какой-то
А вопрос — «угадайте язык».
Что интересно, выражение скорее всего валидно только в придуманной авторе версии C++ где "-~" это самостоятельный оператор, а не два.
Яваскрипт, который вполне себе умеет и -~ и ~- конструкцию -~~--~~-2 не осиливает
Яваскрипт, который вполне себе умеет и -~ и ~- конструкцию -~~--~~-2 не осиливает
просто нужны пробелы, иначе "--" распознаётся как декремент: ideone.com/ybmRx4
— duplicate -
Похоже на Brainfuck
«Теперь вы можете Brainfuck прямо в C».
Обоженет
В C++ можно было и раньше, интерпретатор на шаблонах пишется на коленке. Правда, отжирает по паре гигабайт памяти на мало-мальски сложных программах, но, право же, это такая мелочь по сравнению с улучшенной читабельностью.
А теперь, когда у нас есть еще и user-defined literals…
А теперь, когда у нас есть еще и 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.
Не надо портить строгий, простой и лаконичный язык своими изобретениями.
Я уж думал, вы тут расскажете про 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.
Новые экспериментальные операторы Си++