2015-05-26

Old New Thing: 超最新の実験的C++機能、オタマジャクシ演算子

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

7 comments:

  1. 着目点自体は悪くないと思いますが演算子がキモイです。汗

    ReplyDelete
  2. 問題は、operator -~が定義できないことですね

    ReplyDelete
  3. オタマジャクシに見えないこともさることながら、
    可読性が低いために実用性が疑わしいと思います

    ReplyDelete
  4. 危うく騙されるところでした��

    ReplyDelete
  5. コンパイラは認識して最適化してくれるのでしょうか?

    ReplyDelete
  6. 掛け算と割り算を同時に行う*/演算子というものもあります。ご確認ください。
    http://tricky-code.net/neta/neta01enzanshi.php

    ReplyDelete
  7. 規格の3.9.1で負数は保証されてなくないですか?

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.