当我尝试在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;
不在一个块({}
)
另一种可能性是添加该块
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不是因为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中使用的是什么?
注意gcc接受该代码但不接受没有选项-fpermissive
的g ++,并且使用该选项编译代码时不使用case 2:
这就是为什么我建议添加一个块。
case RH:
treeNode *q = p->right;
在声明之前,您有一个标签。标签只能在声明之前出现。您可以通过在标签可以关联的声明之前添加一个空语句来解决此问题:
case RH:
;
treeNode *q = p->right;