-3

0 のチェックに問題があります。ファイルから数値を取得しようとしましたが (取得しました)、0 の場合は次のように答えました >

0 maybe its not found!(0 | 0)   
0 maybe its not found!(1 | 1)   
0 maybe its not found!(2 | 2)   
0 maybe its not found!(3 | 3)   
0 maybe its not found!(4 | 4)

1が必要で、行から正しい行を取得する場合:

0 maybe its not found!(0 | 0)   
[Line0]: 1 1 1 200 150 6 1 10000000 1     
[Line1]: 1 1 13 14    
0 maybe its not found!(2 | 2)     
0 maybe its not found!(3 | 3)     
0 maybe its not found!(4 | 4)

チェック機能は次のとおりです。

int myClass = 0; //'\0'
for(int i=0; i < Show.line0 && Show.line1; i++)
{
    if( Show.Get[i].m_Class0 && Show.Get[i].m_Class1 == myClass )
    {
      ........
    }
    else
    {
        cout << myClass; cout << " maybe its not found!";
        cout << "(";
        cout << Show.Get[i].m_Class0; 
        cout << " | ";
        cout << Show.Get[i].m_Class1; 
        cout << ")"; 
        cout << endl;
    }

m_class0/1 は int で、値はロードされたファイルから取得されます。myClass の他の値が 0 より大きい場合、必要な番号で始まるファイルから同じ行行を取得しますが、0 では機能しません。

4

2 に答える 2

1

エラーは次の行にあります。

if( Show.Get[i].m_Class0 && Show.Get[i].m_Class1 == myClass )

ここで、コンパイラは次を評価します。

Show.Get[i].m_class0

これがの場合true、コンパイラは次の評価を続けます。

Show.Get[i].m_Class1 == myClass

そうである場合true(&& がオーバーロードされていない限り、この時点でもう一方が真でなければなりません)、ifブロックが実行されます。

問題は最初の条件にあります。が0 でない場合trueとなります。Show.Get[i].m_Class0

あなたが本当に欲しいのは、この場合の反対です(myClass0であるため):

if( Show.Get[i].m_Class0 == myClass && Show.Get[i].m_Class1 == myClass )

今、私はそこにいくつかのことを述べました. 1 つ目は、最初の部分が の場合にのみ 2 番目の部分が評価されることですtrue。これは短絡評価と呼ばれ、時間を節約するために使用されます。ただし、過負荷が発生するoperator&&と、短絡は発生しなくなります。これが 2 番目の状態であり、2 番目の状態から予期しない副作用が発生する可能性があるため、一般的にそうするのはお勧めできません。

例えば:

if (false && ++x)

x&& がネイティブの場合はそのままになりますxが、オーバーロードされたバージョンの場合は増加します。

于 2012-06-01T23:18:48.517 に答える
0
if( Show.Get[i].m_Class0 && Show.Get[i].m_Class1 == myClass )

@chrisがコメントしたように、これはあなたが思っていることをしていません。

if (A && B == 0)「A と B が両方ともゼロに等しい場合」という意味ではありません

「Aが真で、Bがゼロに等しい場合」を意味しA、ゼロはゼロであるため、ゼロの場合は失敗しますfalse

「Aがゼロに等しく Bがif (A == 0 && B == 0)ゼロに等しい場合」を意味する必要があります

于 2012-06-01T23:16:35.923 に答える