yohhoyの日記

技術的メモをしていきたい日記

<--(中略)-- 演算子

プログラミング言語C++のヘンテコな演算子。💘(U+1F498)

#include <iostream>

int main()
{
  int n = 100;
  while ( 0 <-------------------- n) {  // !?
    std::cout << n << ' ';
  }
}

実行結果:

90 80 70 60 50 40 30 20 10

タネ明かし

前掲C++ソースコードの振る舞いを括弧を用いて明確化する。int型の変数nに対し前置デクリメント演算子を10回適用し、その結果を値0と比較している。C++では組込み前置デクリメント演算子の戻り値は左辺値(lvalue)となるため、該当ソースコードはwell-definedとなる。

int n = 100;
while ( 0 < --(--(--(--(--(--(--(--(--(--n))))))))) ) {
  std::cout << n << ' ';
}

C++03 13.6/p4より引用。

For every pair (T, VQ), where T is an arithmetic type other than bool, and VQ is either volatile or empty, there exist candidate operator functions of the form

 VQ T& operator--(VQ T&);
 T operator--(VQ T&, int);

一方、プログラミング言語Cの場合 --(--n) はill-formedとなる。Cでは前置デクリメント演算子の適用結果が右辺値(rvalue)となるため(C99 6.5.3/p2)

関連URL