プログラミング言語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