2026-08-22
counter.cpp
#include <iostream>
int& counter() {
static int n = 0;
return ++n;
}
int main() {
std::cout << counter() << counter() << counter();
}
これは何を出力するでしょうか?
Answer
123。counter()が返しているのはブロックスコープのstatic変数で、これは最初にその宣言を通過したときに一度だけ初期化され、以降の呼び出しでも同じ変数が保持されます。さらにC++17以降、<<のようなオーバーロードされた演算子は左のオペランドの評価(そこに含まれる関数呼び出しも含む)が右のオペランドより先に完了することが保証されているため、3回のcounter()呼び出しは必ず左から右の順に実行されます。