2016-04-07 13 views
2

私の目標はswitch文を使用して関数を単純化することですが、switch文にコードを含める方法を理解することはできません。 printf("(");infixTree(node->left);を追加しても、それぞれのケースでこれらのコード行を追加すると、予期しない時刻に呼び出されることはありませんか?if文をswitch文に変換する

ここに私の現在の機能があります。

void infixTree(ExpNode* node) 
{ 
    if(node->type==INTEGER) 
    { 
     printf("%d",node->value.value.iVal); 
     return; 
    } 

    if(node->type==DOUBLE) 
    { 
     printf("%f",node->value.value.dVal); 
     return; 
    } 

    if(node->type==SYMBOL) 
    { 
     printf("%s",node->symbol); 
     return; 
    } 

    printf("("); 
    infixTree(node->left); 

    if(node->type==ADD_OP) 
    { 
     printf(" + "); 
    } 
    else if(node->type==SUB_OP) 
    { 
     printf(" - "); 
    } 
    else if(node->type==MUL_OP) 
    { 
     printf(" * "); 
    } 
    else if(node->type==DIV_OP) 
    { 
     printf("/"); 
    } 
    else if(node->type==MOD_OP) 
    { 
     printf(" %% "); 
    } 
    else if(node->type==ASSIGN_OP) 
    { 
     printf(" = "); 
    } 

    infixTree(node->right); 
    printf(")"); 
} 

私は、switch文を使用して私の機能は、現時点では、このようになります

printf("("); 
infixTree(node->left); 

が含まれるのか分かりません。

void infixTree(ExpNode* node) 
{ 
    switch(node->type) 
    { 
     case INTEGER : 
      printf("%d", node->value.value.iVal); 
      return; 
     case DOUBLE : 
      printf("%f", node->value.value.dVal); 
      return; 
     case SYMBOL : 
      printf*%s", node->symbol); 
      return; 
    } 

    switch(node->type) 
    { 
     case ADD_OP: 
      printf("("); 
      infixTree(node->left); 
      printf(" + "); 
      break; 
     case SUB_OP: 
      printf("("); 
      infixTree(node->left); 
      printf(" - "); 
      break; 
     case MUL_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" * "); 
      break; 
     case DIV_OP : 
      printf("("); 
      infixTree(node->left); 
      printf("/"); 
      break; 
     case MOD_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" %% "); 
      break; 
     case ASSIGN_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" = "); 
      break; 
    } 

    infixTree(node->right); 
    printf(")"); 
} 
+0

を記述し、それは間違いでした。それはそこにあったはずです。編集 – FatFockFrank

+0

2つの異なるelsifはしごのように、2つの異なる 'switch'esを持つことができます。 –

+0

さて、私はそれを編集しました。 – FatFockFrank

答えて

4

私はそれがすべてのスイッチの支店に

printf("("); 
infixTree(node->left); 

を含める必要はないと思います。圧密さのために

が、私はそう

printf("("); 
infixTree(node->left); 
switch(node->type){ 
    case ADD_OP: 
     printf(" + "); 
     break; 
    case SUB_OP: 
     printf(" - "); 
     break; 
    case MUL_OP : 
     printf(" * "); 
     break; 
    case DIV_OP : 
     printf("/"); 
     break; 
    case MOD_OP : 
     printf(" %% "); 
     break; 
    case ASSIGN_OP : 
     printf(" = "); 
     break; 
} 
+0

2番目のswitch文の最初のcaseの直前ですか? – FatFockFrank

+1

@FatFockFrankはい。私の編集した答えを参照 –

+0

別の質問。これらのケースは列挙値です。私が各スイッチに列挙値をすべて含めないと、エラーが表示されます。 'warning:列挙値 'INTEGER'スイッチで処理されません。 'これを無視することはできますか? – FatFockFrank

関連する問題