c - C中switch中定义的变量

标签 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;
    }
}

最佳答案

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

另一种可能性是添加该 block

    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;

非常可疑,因为*T是一个treeNode *,而EQ不是1,因为case EQ

也许你想要

 (*T)->bf = EQ;
<小时/>

(编辑)

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

#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 为 2 的参数调用程序,那么 printf 中使用的 i 会怎样?

注意,如果没有选项 -fpermissivegcc 接受该代码,但不接受 g++,并且使用该选项编译代码时不使用 case 2:

这就是我建议添加 block 的原因。

关于c - C中switch中定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55520706/

相关文章:

可以直接获取 "stack"中间的元素吗?

c - fopen 与 stat 的性能

c - RGB 十六进制的 RGBA 十六进制

javascript - 在JQuery中使用switch语句时如何将元素数据传递到case中?

ios - PrepareForSegue之谜

c - 在gdb中,是否可以找出哪个内存地址具有某个值?

c 在某些情况下导致程序挂起的管道

javascript - 我想在用户等待时播放警报中的响铃声音

coldfusion - Coldfusion在交换机中调用另一种情况

c++ - 是否可以在编译时错误检查 case 语句选项?