2016-11-02 21 views
-2

これはコンパイルして実行しますが、 "a"のガベージ値を生成します。なぜ "b"のような "a"の増分はないのですか?なぜゴミを生産しているのですか?forループの予期しない動作

for(a,b=0; a,b != 55; a,b++) 
{ 
    //outputs garbage 
    std::cout << "a = " << a << std::endl; 
    //outputs expected results 
    std::cout << "b = " << b << std::endl; 
} 

編集: その他の質問は同様に有効な答えを持っているにもかかわらず、私が感じる疑問が異なっていました。私はセマンティクスに基づいて何かを表現するあらゆる方法を見つけることができません。なぜ出力がうまくいかないかをC++では理解できません。

+3

あなたはC++の構文を勉強する必要があります - 特にカンマ演算子は、あなたが思っていることをしません。 –

+0

もちろん、それはうまくいきますが、期待どおりに動作しないかもしれません。仕事? – CiaPan

+1

私のために働く、あなたはどんな生産を期待していますか? – DaveB

答えて

4

コンマ演算子は、右側の式を実行して、左側の式を実行言う:何もしません

a, b=0 

最初の実行aは、それはBにゼロを代入b=0を実行します。

コンマ演算子が存在するのはなぜですか?カンマ演算子は、式に副作用がある場合に便利です。

コンパイラに指示するシーケンスポイントも提供されています。右のものが起こる前に、左のものすべてが完了する必要があります。これは、コンパイラによって許可された最適化を制限します。たとえば、a + = 1、b = a +コンパイラはインデックスとして使用する前または後でインクリメントできるので、b = ++ a + c [a]のようなものは未定義です。