0

私は次のことを試しました:

if(int i=6+4==10)
    cout << "works!" << i;

if(int i=6+4,i==10)
    cout << "doesn't even compile" << i;

最初のものは正常に動作しますが、2 番目のものはコンパイルされません。どうしてこれなの?

編集:最初のものは意図したとおりに機能しない可能性があることがわかりました。if スコープ内の i の値は、10 ではなく 1 になります (この質問に関するコメントの 1 つで指摘されているように)。

if ステートメント内で同時に変数を初期化して使用する方法はありますfor(int i=0;i<10;i++)か? if((int i=6+4)==10)if スコープ内の I の値が 10 になる (コンパイルされない)ようなものを生成できるようにするには? if ステートメントの前に I を宣言して初期化できることは知っていますが、ステートメント自体の中でこれを行う方法はありますか?

これが役立つと思う理由を説明します。

 if(int v1=someObject1.getValue(), int v2=someObject2.getValue(), v1!=v2)
    {
        //v1 and v2 are visible in this scope 
        //and can be used for further calculation without the need to call
        //someObject1.getValue() und someObject2.getValue() again.
    }
    //if v1==v2 there is nothing to be done which is why v1 und v2
    //only need to be visible in the scope of the if.
4

4 に答える 4

5

イニシャライザ式として使用される式は代入式である必要があるため、コンマ演算子を使用する場合は、イニシャライザを括弧で囲む必要があります。

6 + 4例(副作用がなく、値が破棄され、独自の初期化子での初期化されi == 10ていない値を使用するため、試行していることはあまり意味がありません。)i

if (int i = (6 + 4, i == 10)) // behaviour is undefined

本当にこういう意味ですか?

int i = 6 + 4;
if (i == 10)

if新しい変数を宣言するその形式を使用する場合、チェックされる条件は常に、に変換された初期化された変数の値ですbool。条件を新しい変数を含む式にする場合は、ステートメントの前に変数を宣言し、ifテストする式を条件として使用する必要があります。

例えば

int i;
if ((i = 6 + 4) == 10)
于 2012-07-21T12:40:55.570 に答える
3

どちらの例も、何か役に立つことをするに役立つとは真剣に疑っています。それが行うのは、複雑な方法で「真」と評価することだけです。

しかし、2番目の宣言がコンパイルされない理由は、2つの宣言として解釈されるためです。これは、割り当てint i = 6+4; int i==10int i==10はなく等式演算子であるため、無効です。

于 2012-07-21T12:40:42.987 に答える
-1

必要なことを実行できないため、さまざまな選択肢があります(コンマ演算子と宣言を混在させることはできません)。たとえば、if条件の外で変数を宣言できます。

int i = 6+4;
if ( i == 10 ) ...

または、の値を代わりに変更してi0ブロック内で10再計算することもできます。ielse

if ( int i = (6+4)-10 ) ; else {
   i += 10;
   // ...
}

ループ内の値がわかっているので、もっと簡単に、変数を宣言しないでください。

if ( (6+4)==10 ) {
   int i = 10;
   // ...
}

iもちろん、そうでない場合はの値が必要でない限り、10その場合は2番目のオプションが最も適切です。

于 2012-07-21T12:54:35.340 に答える