1
bool foo( int* p )
{
  return false;
}

int* bar (  )
{
  int* p;
  return p;
}

int main() {

  if ( int* p = bar() && foo( p ) )
  //if ( ((int* p = bar()) != NULL ) && (foo( p )) ) // another variant
  {

  }

  return 0;
}

私は GCC 4.3.4 と VS 2008 を取得します。すべてが正常に動作するerror: cannot convert ‘bool’ to ‘int*’ in initialization場合のみ。if ( int* p = bar())

-statement のp前に初期化できることはわかっていますが、示したバリアントに興味があります。if

4

7 に答える 7

4
int* p = bar() && foo( p )

最初に論理式を評価し、次に代入します

書くのと同じ:

int *p = ( bar() && foo(p) );
于 2012-07-17T10:20:37.787 に答える
3

代入演算子=はブール値よりも優先度が低いため、次のように&&なります。

int* p = ( bar () && foo(p) )

boolこれは、aをint*変数に割り当てようとする試みです。

編集:ループのブロックで変数を宣言して初期化することは一般的に受け入れられている慣行ですが( のようにfor(int i = 0; i < n; ++i))、条件ステートメントのそのような構成に反対することを強くif()お勧めします。コードの可読性を低下させるだけでなく、対処したい。

他のバリアントは機能するはずです(ただし、宣言の結果を NULL と比較したいかどうかはわかりませんが、これは言語に好まれていない可能性があります)が、上記のコードの明快さint*...に関するコメントを参照してください

于 2012-07-17T10:20:44.893 に答える
2

の構文では、括弧内に条件ifが必要です。条件は、式または宣言 ( への暗黙的な変換を持つ型) のいずれかです。これらを組み合わせることはできません。の場合bool

if ( int* p = bar() && foo( p ) )

条件は " " です。これは、 で初期化されint* p = bar() && foo( p )た型の単純な宣言です。の型は notであり、暗黙的に に変換できないため、エラーが発生します。int*bar() && foo( p )bar() && foo( p )int*int*

あなたが書く場合:

if ( (int* p = bar()) != NULL )

、左括弧は、これが宣言(単純またはいいえ)であることint* p = bar()ができず、正当な(サブ)式ではないことを意味します.

覚えておくべき重要な点は、宣言または 式を使用できますが、それらを結合することはできず、C++ では宣言を式の一部として使用できないことです。(また: 宣言にはコピーの初期化が必要です:

if ( int* p = bar() )

、直接の初期化は許可されていません。)

于 2012-07-17T10:46:22.267 に答える
2
#include <iostream>
bool foo( int* p )
{
  return false;
}

int* bar (  )
{
  int* p;
  return p;
}

int main() {
  int* p;
  if ( (p = bar()) && foo( p ) )
  //if ( ((int* p = bar()) != NULL ) && (foo( p )) ) // another variant
  {

  }

  return 0;
}

また

int main() {

  if ( int* p = bar()){
      if ( foo( p ) ){ /*do something*/ }
  }
  return 0;
}

それが実行されます

于 2012-07-17T10:24:07.070 に答える
2

ifステートメントの条件は、宣言または式のいずれかです。宣言は式ではないため、実行しようとしているように別の式と組み合わせることはできません。つまり、あなたが望んでいた間に

(int* p = bar()) && foo(p)

は式ではないため、これは有効ではint* p = bar()ありません。代わりに、宣言として読み取られます

int* p = (bar() && foo(p))

初期化子の型が間違っているため、これは有効ではありません。

この場合、ifステートメントの前にポインターを宣言する必要があります。いくつかのオプションは次のとおりです。

int* p = bar(); // pollutes surrounding scope; maybe wrap in another block
if (p && foo(p)) {}

if (int* p = bar()) {
    if (foo(p)) {  // extra nesting
    }
}
于 2012-07-17T10:44:21.287 に答える
0

私はそれが演算子の優先順位だと信じています。あなたは実際に実行します:

if ( int* p = (bar() && foo( p )) )

しかし、実行するとは、次のことだと思います。

if ( (int* p = bar()) && foo( p ) )

これはまったく同じではありません。

于 2012-07-17T10:21:22.187 に答える
-1

実際には、で割り当てを行ってint* p = bar()おり、ステートメントは と の 2 つの型を比較しようとしてintいますがbool、それは不可能です。

IF ステートメントの前に割り当てる必要があります。

お役に立てれば

于 2012-07-17T10:19:55.527 に答える