2016-04-07 2 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(")"); 
} 

Я не знаю, как я бы включил

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

У вас могут быть два разных «переключателя», например, у вас есть две разные лестницы elsif. –

+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

Итак, как раз перед первым случаем во втором операторе switch? – FatFockFrank

+1

@FatFockFrank Да. См. Мой отредактированный ответ –

+0

Другой вопрос. Эти случаи являются значениями перечисления. Когда я не включаю все значения перечисления в каждом коммутаторе, я получаю сообщение об ошибке. 'warning: значение перечисления 'INTEGER' не обрабатывается в switch'. Могу ли я игнорировать это? – FatFockFrank

Смежные вопросы