2016-07-02 10 views
4

このコードを見てください。なぜa+1;bに割り当てられているのですか?C++でスコープを変数に代入する

#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    int a = 5; 

    int b = ({ 
     std::cout << "inside scope" << std::endl; 
     a+1; 
    }); 

    std::cout << "b value: " << b; 
} 
+0

[ステートメント式](http://stackoverflow.com/a/8344122/5922757)です。 – Jezor

+2

標準ではないC++ –

+2

さて、少なくとも[大きな脂肪の警告](http://coliru.stacked-crooked.com/a/c27d7a6ee5891096)があります。 –

答えて

7

構造

int b = ({ 
    std::cout << "inside scope" << std::endl; 
    a+1; 
    }); 

&hellip;標準のC++ではなく、g ++コンパイラによって提供されるの言語拡張です。

これは“statement expression”と呼ばれ、本質的に計算にローカル変数を導入することを可能にします。シーケンス内の式が順番に評価されているいずれの場合も

int b = (
    std::cout << "not inside scope" << std::endl, 
    a+1 
    ); 

、および式の値:あなたはそれを使用していないので

、あなただけの標準C++のような“comma expression”を使用している可能性が全体としての最後の評価の価値です。


ここでは、変数を導入する必要があります。

int b = [&](){ 
    double bah = 3.14; 
    std::cout << "inside scope" << std::endl; 
    return a+!!bah; 
    }(); 

C++ 17以降では、あなたがそのようなコードをより明確にするためにstd::invokeを使用することができますJavaScript'ishせずに、標準C++ラムダとすることをループは、初期化子での演算のために、あなたが行うことができます末尾の()が呼び出されますが、先頭にはinvokeという語があります。

+0

完全にお返事ありがとうございます –

1

、それは非常に明確ではない、のように私はコードを書く助言するものではありません

b = a + 1 = 5 + 1 = 6

この場合におけるように、スコープの値は、範囲内の最後の文です。

文法と呼ばれるGCCの拡張であり、ポータブルでないため使用しない別の理由があります。 GCCは警告を返します。

warning: ISO C++ forbids braced-groups within expressions [-Wpedantic]

関連する問題