これは法規または規則違反になりますか?
switch (expr)
{
do
{
case 6:
/*...*/
if (/*...*/)
break;
case 7:
/*...*/
} while (0);
case 9:
/*...*/
break;
default:
break;
}
これは、いくつかの条件が満たされた場合にのみ、ケース 6 に続いてケース 7 を実行する合法的な方法でしょうか? または、これにより未定義の動作が発生し、鼻のドラゴンがスイッチから出てきますか? ps私の質問はc99を参照しています。
編集:
私がやりたいことは次のとおりです。ケース9を想定し、すべてのケースで実行する必要があります。expr が 6 の場合、6 を実行する必要があり、いくつかの条件の下で 7 を実行し、その後 9 を実行するか、expr が 7 の場合は 7->9 を実行する必要があるため、いくつかの条件が満たされた場合は 7 をスキップしたいのですが、6 の順序を変更することはできません。 、7、9。
EDIT2:
別の解決策を探しているわけではありません。このスニペットの動作に興味があるだけです。
switch ステートメントに、可変に変更された型の識別子のスコープ内に関連付けられた case または default ラベルがある場合、switch ステートメント全体がその識別子のスコープ内にある必要があります。
ISO/IEC 9899:TC3 6.8.4.2->3 から
その振る舞いに不安を感じさせます。しかし、それが私のスニペットのようなコードを狙っているかどうかはわかりません。