在C

时间:2019-04-04 16:17:13

标签: c switch-statement

当我尝试在switch语句中分配指针时,
编译给了我一个错误警告,但是当我通过在switch语句之外声明
指针来调试代码时。
语法上通过了代码。为什么?谁能向我解释?谢谢!

在调试之前:

void Left_Balance(treeNode **T)
{
    treeNode *p=(*T)->left;  
    switch(p->bf)
    {
        case LH:
            p->bf=(*T)->bf=EQ;
            L_Rotate(T);
            break;
        case RH:
             treeNode *q = p->right;  
            switch(q->bf)
           {
               case LH:
                   (*T)->bf=RH;
                   p->bf=EQ;
                   break;
               case EQ:
                   (*T)->bf=q->bf=EQ;
                   break;
               case RH:
                   p->bf=LH;
                   (*T)=EQ;
                   break;
           }
            q->bf=EQ;
            R_Rotate(&p);
            L_Rotate(T);
            break;
    }
}

调试后:

void Left_Balance(treeNode **T)
{
    treeNode *p=(*T)->left;
    treeNode *q;     //Here is the difference 
    switch(p->bf)
    {
        case LH:
            p->bf=(*T)->bf=EQ;
            L_Rotate(T);
            break;
        case RH:
            q = p->right;    //Here is the difference 
            switch(q->bf)
           {
               case LH:
                   (*T)->bf=RH;
                   p->bf=EQ;
                   break;
               case EQ:
                   (*T)->bf=q->bf=EQ;
                   break;
               case RH:
                   p->bf=LH;
                   (*T)=EQ;
                   break;
           }
            q->bf=EQ;
            R_Rotate(&p);
            L_Rotate(T);
            break;
    }
}

2 个答案:

答案 0 :(得分:1)

您的第一个版本treeNode *q = p->right;不在阻止({}

另一种可能性是添加该区块

    case RH:
  {
    treeNode *q = p->right;  
        switch(q->bf)
       {
           case LH:
               (*T)->bf=RH;
               p->bf=EQ;
               break;
           case EQ:
               (*T)->bf=q->bf=EQ;
               break;
           case RH:
               p->bf=LH;
               (*T)=EQ;
               break;
       }
        q->bf=EQ;
        R_Rotate(&p);
        L_Rotate(T);
        break;
  }

警告

 (*T)=EQ;

非常可疑,因为*TtreeNode *,而EQ不是一个,因为case EQ

也许你想要

 (*T)->bf = EQ;

(编辑)

@dbush表示在标签和声明之间添加一条语句就足够了,但是不将声明放在块中是非常危险的,请查看该代码:

#include <stdio.h>

int main(int argc, char ** argv)
{
  switch (argc) {
  case 1:
    puts("case 1");

    int i = 123;

    puts("i initialized and continue in case 2");

  case 2:
    printf("in case2, i values : %d\n", i);
  }

  return 0;
}

如果调用带有初始化 argc 的参数的程序调用了 printf 中的 i 是2?

注意 gcc 接受不带选项-fpermissive的代码,但不接受 g ++ ,带该选项的代码不带case 2:

这就是为什么我建议添加一个块。

答案 1 :(得分:0)

    case RH:
         treeNode *q = p->right;  

在这里,您在声明之前有一个标签。标签只能在声明之前。您可以通过在标签可以与之关联的声明之前添加一个空语句来解决此问题:

    case RH:
         ;
         treeNode *q = p->right;