case
ステートメントを別のステートメントにネストすることを説明してください。他のすべてのステートメントが に関連付けられたループ内にあるDuffs Deviceについて言及して います。私はそれを理解することができません。ネストされた のように振る舞うべきだと私には思えます。しかし、私は間違いなく何かが欠けています。説明してください。case
do-while
case 0
if
2 に答える
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
。これにより、答えの最初のステートメントである結論につながります。
ダフの装置を理解する最も簡単な方法は、その 2 つの論理コンポーネントであるswitch
とdo/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/while
switch