switchステートメントをお楽しみください

私はシンプルで実用的なコードを持っていました(不要なものを削除し、本質だけを残しました):

typedef enum { enNone, enOne, enTwo, enThree }TEnum; switch(Enum) { case enNone: /*  */ break;/*enNone*/ case enOne: Value=f1(Value); Value=A*Value+B; break;/*enOne*/ case enTwo: Value=f2(Value); Value=A*Value+B; break;/*enTwo*/ case enThree: Value=f3(Value); Value=A*Value+B; break;/*enThree*/ }/*SWITCH*/
      
      







私は彼に対して大きな不満はありませんでしたが、彼を微最適化することにしました



冗長性を排除し、一般的な変換を個別にレンダリングすることにしました。

次のようになりました。

  if(enNone!=Enum) { switch(Enum) { case enOne: Value=f1(Value); break;/*enOne*/ case enTwo: Value=f2(Value); break;/*enTwo*/ case enThree: Value=f3(Value); break;/*enThree*/ }/*SWITCH*/ Value=A*Value+B; }/*THEN*/
      
      







すべてが素晴らしく、コードはよりコンパクトになり、コードの正確性は低下しませんでしたが、コンパイラーはswitchステートメントで列挙定数の1つが処理されないという警告を出し始めました。



警告が出ないようにプログラムしようとしています。そこで、ここで何ができるかを考え、 Duffデバイスを思い出して、次のようにしました。



  switch(Enum) { case enNone: break; do { case enOne: Value=f1(Value); break;/*enOne*/ case enTwo: Value=f2(Value); break;/*enTwo*/ case enThree: Value=f3(Value); break;/*enThree*/ }while( 0 ); Value=A*Value+B; }/*SWITCH*/
      
      







警告は消えましたが、コードはサポートされていないことが判明したため、前回を賞賛した後、元のバージョンにロールバックしました。



このコードが機能するのは、 switchステートメントの C言語では、複合ステートメントの制限が非常に緩和されているため、正しく構成するだけで、 caseラベルステートメントの前にあるためです。

最初のbreakステートメントのみ スイッチ構成を終了し、残りはdo {} whileループを終了します



また、このようなスイッチ機能を使用してCでコプロセスを整理することも知っていますが、残念ながら、この機能のこのような便利なアプリケーションの例は見つかりませんでした。



All Articles