0

caseステートメントを別のステートメントにネストすることを説明してください。他のすべてのステートメントが に関連付けられたループ内にあるDuffs Deviceについて言及して います。私はそれを理解することができません。ネストされた のように振る舞うべきだと私には思えます。しかし、私は間違いなく何かが欠けています。説明してください。casedo-whilecase 0if

4

2 に答える 2

3

switch-caseコンストラクトでは、本体は、switch他の有効な c ステートメントを含むことができる単なる通常のステートメントまたは複合ステートメントです。caseまたはdefaultラベルを含む場合もあります。そして、制御式の値に応じて適切なケース ラベルに制御がジャンプし、a が検出されない限り、
他のスコープと同様に、switch 本体のステートメントが次々と実行されます。 { }break

たとえば、次の簡単なテスト プログラムを考えてみましょう。

#include<stdio.h>
int main()
{
    int i = 6;//5,10;
    switch(6)
    {
        case 10:
              printf("\nIn case 10");
        case 11:
              printf("\nIn case 11");              
        case 12:
              printf("\nIn case 12");
              break;
        case 5:
              printf("\nIn case 5");
              break;
        case 6:
              printf("\nIn case 6");     
        default:
              printf("\nIn Default");

    }

    return 0;
}

ステートメント の制御式の 3 つの値を検討iしてください。switch

5   
6
10

結果の出力は次のとおりです。
シナリオ 1: i = 6

In case 6
In Default

シナリオ 2: i = 10

In case 10
In case 11
In case 12

シナリオ 3: i = 5

In case 5

上記のシナリオのそれぞれで、一致するcaseラベルが検出されると、a が検出されるまでステートメントが順番に実行されることに注意してくださいbreak。これにより、答えの最初のステートメントである結論につながります。

于 2012-02-23T15:36:51.567 に答える
1

ダフの装置を理解する最も簡単な方法は、その 2 つの論理コンポーネントであるswitchdo/whileループを互いに分離することです。2 つのステートメントがネストされていない、論理的に同等の実装を次に示します。

void copy(int* to, int* from, int count) {
    int n = (count + 7) / 8;
    switch(count % 8) {
        case 0: goto case_0;
        case 1: goto case_1;
        case 2: goto case_2;
        case 3: goto case_3;
        case 4: goto case_4;
        case 5: goto case_5;
        case 6: goto case_6;
        case 7: goto case_7;
    }
    do {
        case_0: *to++ = *from++;
        case_7: *to++ = *from++;
        case_6: *to++ = *from++;
        case_5: *to++ = *from++;
        case_4: *to++ = *from++;
        case_3: *to++ = *from++;
        case_2: *to++ = *from++;
        case_1: *to++ = *from++;
    } while (--n);
}

ループ内のラベルに注意してください。ラベルではなく、通常の C ラベルcaseです。

このコードと Duff のデバイスの唯一の違いは、Duff のコードは、ループ自体がステートメント内で開始および終了する限りcase、ループ内でラベルを使用する機能を利用し、「通常の」ラベルと goto の必要性を排除することです。do/whileswitch

于 2012-02-23T17:37:23.847 に答える