昨夜、好奇心旺盛なダフの装置に初めて遭遇しました。私はそれについていくつか読んでいますが、理解するのはそれほど難しいことではないと思います。私が興味を持っているのは、奇妙な構文です(ウィキペディアから):
register short *to, *from;
register int count;
{
register int n = (count + 7) / 8;
switch(count % 8) {
case 0: do { *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 > 0);
}
}
switch ステートメントの C++ 標準定義を読んでいました(それが古い場合はお知らせください。Open-Std.org に詳しくありません)。私が理解できる限り、case ステートメントは、switch ステートメントで使用する単純化されたジャンプ ステートメントです。
スイッチ自体はネストされた do-while を完全に無視し、ループは case ステートメントを無視します。ループ内でスイッチがジャンプするので、ループが実行されます。スイッチは (8 による除算の) 剰余をカバーするためにあり、ループは均等に割り切れる部分を処理します。これはすべて理にかなっています。
私の質問は、なぜぎこちない構文なのですか? すべての case ステートメントがその中に含まれるようにループを書くことができると思います。標準にはこの動作を禁止するものは何も見当たらず、GCC 4.7 で正しくコンパイルされるため、以下は合法と見なされますか?
register short *to, *from;
register int count;
{
register int n = (count + 7) / 8;
switch (count <= 0 ? 8 : count % 8)
{
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++;
default: ; // invalid count, suppress warning, etc.
} while(--n > 0);
}
}
これにより、コードの意図がより明確になります。フィードバックをお寄せいただきありがとうございます。;)
編集:以下に示すように、元のコードは C 用に書かれており、count変数とn変数に暗黙的な int がありました。C++ のタグを付けたので、それを変更しました。
編集 2:無効なカウント値を考慮して、改訂されたサンプル コードを修正しました。