2016-04-01 14 views
1

この行はどのように機能しますか? static bool const unused = (WillOnlyRunOnce(), true)一度実行する関数

私はこのコードに似たコードを見つけましたが、私はそれを理解することができません。

void WillOnlyRunOnce() { 
    std::cout << "WillOnlyRunOnce" << std::endl; 
} 
void Init() { 
    static bool const unused = (WillOnlyRunOnce(), true); 
} 
void main() 
{ 
    Init(); 
    Init(); 
    Init(); 
} 

答えて

0

unusedは、プログラムの実行時に1回だけ初期化されます。 (WillOnlyRunOnce(), true)が評価されるものに初期化されます。

(WillOnlyRunOnce(), true)は、カンマ演算子を含む式です。最初の式の値はWillOnlyRunOnce()が返す値です。 2番目の式の値はtrueです。式全体の値は最後の式の値です。この場合、それはtrueです。

unusedの初期化後、その値はリセットされません。したがって、(WillOnlyRunOnce(), true)は複数回評価されません。その結果、Initが複数回呼び出されても、WillOnlyRunOnceが1回だけ呼び出されます。

+0

ご協力ありがとうございます。あなたは「使用されていないが初期化された後、その値はリセットされていません」ということを詳しく教えてください。ここでリセットは何を意味しますか?また、「リセット」されている場合はどうなりますか? –

+1

@ abhishek_naikの場合、値をリセットするには別のコード行が必要です。初期化線は、変数が「静的」記憶期間を有するので、1回だけ実行される。 –

+0

@R Sahu、ありがとう! :) –

0

Static local variableは初回のみの制御で初期化される宣言を通過して一度だけなので、WillOnlyRunOnce()も一度だけ呼び出されます。

指定子staticを持つブロックスコープで宣言された変数は、静的記憶期間を持ちますが、初期化がゼロまたは定数初期化でない限り、制御が最初に通過すると初期化されます最初に入力した)。 以降のすべての呼び出しで、宣言はスキップされます。

関連する問題