0

コンピューター サイエンスの入門クラスで、次のような質問がありました。

「すでに宣言されている char 変数 c が与えられた場合、最後に 'Y' または 'y' または 'N' または 'n' が入力されるまで、標準入力から値を c に繰り返し読み取るコードを記述してください。」

入力したコードは無限ループを引き起こしますが、ロジックは理にかなっています。次のブール式が間違っている理由を誰か説明してもらえますか?

while (c != ('n' || 'N' || 'y' || 'Y'))

  cin >> c;
4

4 に答える 4

7

その表現は、あなたが思っていることをしないからです。正しいのは

while (c !='n' && c != 'N' && c!= 'y' && c != 'Y')

しかし、あなたが上に提示したものはどうなりますか?

('n' || 'N' || 'y' || 'Y')

これは一連の 4 つのブール OR です。1 つ目は'n' || 'N'で、とcharがブール値 (両方とも) に変換されるため、式全体はです。'n''N'truetrue

だからあなたは残っています

while (c != true)

これは と同じでc != 1、ASCII 値 1 の文字を入力するまでループに入ります。これは印刷可能な文字ではないため、キーボードからの入力によってループから抜け出すことはできません。

于 2013-09-07T15:41:26.067 に答える
4

これ:

while (c != ('n' || 'N' || 'y' || 'Y'))

次と同等です。

while (c != true )

一緒に ORd された値のグループはtrue、それらの 1 つ以上がゼロ以外の場合に評価されるためです。おそらく探しているのは次のとおりです。

while ( c != 'n' && c != 'N' && c != 'y' && c != 'Y' )

于 2013-09-07T15:42:15.473 に答える
2

ループの条件が正しくありません。

正しい条件は次のとおりです。

while ( c != 'n' && c != 'N' && c != 'y' && c != 'Y' )
{
    // ...
}

あなたが書くとき:

while (c != ('n' || 'N' || 'y' || 'Y'))

cが と異なるかどうかを尋ねます('n' || 'N' || 'y' || 'Y')。しかし、この式自体は として評価されます。trueこれは、ゼロ以外の値を ORd したものは常に として評価されるためtrueです。したがって、あなたの条件は次と同等です:

while( c != true )

それは無限ループにつながります...

于 2013-09-07T15:42:19.133 に答える
0

試す

while (c !='n' && c!='N' && c!= 'y' && c!='Y')

cin >> c;

'n','N','y','Y'あなたは常に真(非ゼロ)に等しい「OR」をしています。これがループが終了しない理由です。

于 2013-09-07T15:40:53.957 に答える