New C++ experimental feature: The tadpole operators - The Old New Thing - Site Home - MSDN Blogs
僕はよくこういうコードを書いている。
x = (y + 1) % 10; x = (y + 1) * (z - 1); x = (double)(f(y) + 1);
+と-の演算子は優先順位が極めて低いために、その周りに括弧を多用しなければならず、とても読みにくい深くネストされたコードができあがってしまう。
Visual Studio 2015 RCには、実験的な演算子が2つ追加されている。その名もオタマジャクシ演算子。これは整数値から括弧を必要とすることなく1を加算、減算できる演算子である。
x = -~y % 10; x = -~y * ~-z; x = (double)-~f(y);
オタマジャクシ演算子と名付けられた理由は、オタマジャクシが値に向けて泳ぐ姿と、値から遠ざかって泳ぐ姿に似ているためである。チルダがオタマジャクシの頭で、ハイフンが尻尾だ。
文法 意味 説明 -~y
y + 1
オタマジャクシが値に向かって泳ぐと大きくなる ~-y
y - 1
オタマジャクシが値から遠ざかって泳ぐと小さくなる この実験的オタマジャクシ演算子を有効にするには、C++ファイルの上部に以下のような行を追加しなければならない。
#define __ENABLE_EXPERIMENTAL_TADPOLE_OPERATORS
例えば、以下はオタマジャクシ演算子を使ったコードの例である。
#define __ENABLE_EXPERIMENTAL_TADPOLE_OPERATORS #include <ios> #include <iostream> #include <istream> int __cdecl main(int, char**) { int n = 3; std::cout << "3 + 1 = " << -~n << std::endl; std::cout << "(3 - 1) * (3 + 1) " << ~-n * -~n << std::endl; return 0; }
この演算子はまだ実験的機能であることに注意すること。公式なC++の一部ではない。しかし、使ってみて感想を教えてくれ。
ちなみに、このオタマジャクシ演算子はx86とx86-64向けのGCCもClangもすでに実装済みであり、Borland 5.5やMSVC6.0といった超古代のコンパイラーすら対応している。
ドワンゴ広告
整数を2の補数で表現する場合、
\[-y = \sim{y} + 1\] \[ \sim{y} = -y -1 \]
つまり、
\[-\sim{y} = -(-y - 1) = y + 1\] \[\sim{-y} = \sim\sim{y} - 1 = y - 1\]
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0
着目点自体は悪くないと思いますが演算子がキモイです。汗
ReplyDelete問題は、operator -~が定義できないことですね
ReplyDeleteオタマジャクシに見えないこともさることながら、
ReplyDelete可読性が低いために実用性が疑わしいと思います
危うく騙されるところでした��
ReplyDeleteコンパイラは認識して最適化してくれるのでしょうか?
ReplyDelete掛け算と割り算を同時に行う*/演算子というものもあります。ご確認ください。
ReplyDeletehttp://tricky-code.net/neta/neta01enzanshi.php
規格の3.9.1で負数は保証されてなくないですか?
ReplyDelete