1

私が取り組んでいる例では、「a」から「z」の間の母音を選択するコードがあります。個別の大文字小文字の代わりに、文字値が同じ大文字小文字を共有しているswitchステートメントを使用しています。私がこれまでに知っていることから、関係する表現はすなわち

***(letter * (letter >= 'a' && letter <= 'z'))*** 

trueまたはfalseに評価され、整数(1および0)に変換され、falseの場合に結果を処理するために「ケース0:」(0は明らかにfalse)になります。このステートメントに関連する変換プロセスへの表現を誰かが説明できますか?特に論理式の乗算の背後にある理由。これが私のサンプルコードです:

char letter(0); 
cout << endl
     << "Enter a small letter: ";
 cin >> letter;

switch(letter * (letter >= 'a' && letter <= 'z'))
{
case 'a': case 'e': case 'i': case 'o': case 'u':
    cout << endl << "You entered a vowel.";
    break;

case 0:
        cout << endl << "That is not a small letter.";
        break;

    default: cout << endl << "You entered a consonant.";
}

編集:すべての素晴らしい答えの人。たくさん片付けた。ご入力いただきありがとうございます

4

3 に答える 3

2
letter * (letter >= 'a' && letter <= 'z')

条件式被乗数は、trueまたはfalseに評価されます。のASCII値はletter、文字「a」および「z」と比較されます。TrueとFalseは、それぞれ1と0の数字に暗黙的に変換できます(そしてletter、その数値ASCII値に変換されます)。したがって、次のいずれかになります。

letter * (0)

また

letter * (1)

0は0です。これは、対応するケースがない場合、コントロールがデフォルトのケースに移行することを意味します(これはcase: 0パーツに移行します)。それ以外の場合letter * (1)letter、であるため、他のケースでは、であるかのように比較されswitch (letter)ます。

于 2013-02-08T02:21:51.937 に答える
1

(letter >= 'a' && letter <= 'z')はブール式でありtrue、文字がとの間にあるかどうか'a'を評価し'z'ます。ここで、これにを掛けるとletter、最初ににプロモートされchar、値1が、の場合trueは0、の場合は0と見なされfalseます。

0したがって、括弧内の条件がと評価された場合false、またはゼロと評価された場合は、式全体が生成されます。これは、ゼロを乗算するとゼロが生成され、1を乗算するとそれ自体が生成されるためです。lettertrueletter

于 2013-02-08T02:23:45.683 に答える
1
(letter * (letter >= 'a' && letter <= 'z'))

2つの部分に分けてみましょう。

(letter >= 'a' && letter <= 'z')

これは簡単です。のASCIIコードletterより大きく、小さいa ASCIIコードですz。アスキーでは文字が次々と増えているので、これは文字が小さい文字であることを意味します。ただし、この式の結果はtrue/falseであり、次の段階で1/0に変換されます。

(letter * <1/0>) 

この段階で、letter * 1文字をletter * 0返し、を返します0。これは、caseステートメントがどのように機能するかを説明しています。

ここにあなたを連れてきたのとまったく同じ理由(読みやすさの欠如)のために、私はこれをif最初に分割し、小文字をチェックしてから、に渡しswitchます。

于 2013-02-08T02:24:32.713 に答える