2

重複の可能性:
ダフのデバイスはどのように機能しますか?

これがどのように機能するかを理解しようとしています。どんな助けでも大歓迎です。

#include<stdio.h>

void duff(int count)
  {
      int n=(count+7)/8;
      printf("n=%d  count =%d\n",n,count%8);
      switch(count%8){
      case 0: do{ printf("case 0\n");
      case 7:  printf("case 7\n");
      case 6: printf("case 6\n");
      case 5: printf("case 5\n");
      case 4: printf("case 4\n");
      case 3: printf("case 3\n");
      case 2: printf("case 2\n");
      case 1: printf("case 1\n");
              }while( --n >0);
      }
  }

main(){
int count;
scanf("%d",&count);
duff(count);

}

基本的に、switch case が case ステートメント 2 に評価される場合、while の do ステートメントは実行されません。しかし、私はこのプログラムを実行しましたが、出力が得られましたが、説明できません:
出力:

3
n=1 カウント =3
ケース 3
ケース 2
ケース 1

4

3 に答える 3

3

これはダフのデバイスとして知られており、分岐命令を削減するためのコード最適化手法で使用されます。これが機能する理由は、デフォルトでは、ブレークのない case ステートメントは次のケースにフォールスルーするため、ケース 3 にヒットすると、ケース 2 とケース 1 に進み続けるためです。

于 2012-03-07T03:07:32.417 に答える
1

doと「ステートメント」はどちらも、case本質的には単なる「goto ラベル」です。実際のコードは追加しません。彼らはwhileswitch(それぞれ)どこにジャンプするかを伝えるだけです。つまり、doto (not) execute のコードはありません。

(とは言っても、C の文法では、 a の直接の子としてではなくcases、 の子に存在することが許可されていることは、やや注目に値する/奇妙です。)switchswitch

于 2012-03-07T03:08:59.460 に答える
0

ケース間にステートメントがないbreakため、ケースは失敗します。したがって、n=3 の原因case 3: case 2:で andcase 1:が実行されます。

于 2012-03-07T03:08:11.727 に答える