当我尝试在 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 会怎样?
注意,如果没有选项 -fpermissive
,gcc 接受该代码,但不接受 g++,并且使用该选项编译代码时不使用 case 2:
这就是我建议添加 block 的原因。
关于c - C中switch中定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55520706/