当我尝试编译代码时,我不断收到此错误消息:
badges.c: In function ‘badgeAnyColor’:
badges.c:335: error: label at end of compound statement
为了帮助您了解它所抱怨的位置,投诉是在switch语句的最后一行,它说:“案例5:”。我还有一个问题是我是否正确地在语法上正确地执行switch语句(我对使用带有if / else语句的switch语句完全不熟悉)将不胜感激!
这是我的代码:
int badgeAnyColor(int x, int y) {
int bronzebadges, northbadges, northeastbadges, northwestbadges, eastbadges,
westbadges, southbadges, southeastbadges, southwestbadges, polybadge;
double fs, ht, fp, sunexp, irrexp;
if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
fs = fieldScore(x, y);
ht = harvestTime(x, y);
fp = fieldProfit(x, y);
sunexp = sunExposure(x, y);
irrexp = irrigationExposure(x, y);
bronzebadges = countBadges(x, y);
northbadges = countBadges(x, y + 1);
northeastbadges = countBadges(x + 1, y + 1);
northwestbadges = countBadges(x - 1, y + 1);
eastbadges = countBadges(x + 1, y);
westbadges = countBadges(x - 1, y);
southbadges = countBadges(x - 1, y - 1);
southeastbadges = countBadges(x + 1, y - 1);
southwestbadges = countBadges(x - 1, y - 1);
switch (bronzebadges) {
case 0: {
if (x == 1 && y == 1) {
if (northbadges == 0 && northeastbadges == 0 &&
eastbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 1) {
if (northbadges == 0 && northwestbadges == 0 &&
westbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 1 && y == 20) {
if (eastbadges == 0 && southeastbadges == 0 &&
southbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 20) {
if (westbadges == 0 && southwestbadges == 0 &&
southbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if ((x >= 2 && x <= 19) && y == 1) {
if (westbadges == 0 && northwestbadges == 0 && northbadges == 0
&& northeastbadges == 0 && eastbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
return polybadge;
}
case 1: {
if (fs >= 20) {
polybadge = 1;
}
else {
polybadge = 0;
}
return polybadge;
}
case 2: {
if (fp <= 0 || ht < 80 || sunexp > irrexp) {
polybadge = 1;
}
else {
polybadge = 0;
}
return polybadge;
}
case 3: {
if ((x >= 2 && x <= 19) && y == 1) {
if (((westbadges + northbadges) >= 2) || ((northbadges +
eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 1 && y == 1) {
if ((northbadges + eastbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 1) {
if ((northbadges + westbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 1 && y == 20) {
if ((southbadges + eastbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 20) {
if ((southbadges + westbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if ((x >= 2 && x <= 19) && y == 20) {
if (((westbadges + southbadges) >= 2) || ((southbadges +
eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
else {
if (((northbadges + westbadges) >= 2) || ((westbadges +
southbadges) >= 2) || ((southbadges + eastbadges) >= 2) ||
((northbadges + southbadges) >= 2) || ((westbadges +
eastbadges) >= 2)) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
return polybadge;
}
case 4:
case 5:
}
}
else {
polybadge = -1;
}
return polybadge;
}
答案 0 :(得分:3)
错误:复合语句末尾的标签
上述错误是由于这两种情况
case 4:
case 5:
// here you need to add statement
//if you don't want to do anything simple break statement will work for you
break;
现在您没有使用这两种情况您也可以删除它们。
修改
如果我想在案例3中发生的同样事情也发生在案例4和5中怎么办?并感谢输入
您需要移动案例4和案例5
case 3:
case 4:
case 5:
//statements you written for case 3
例如
switch(n)
{
case 1:
printf("case 1");
break;
case 2:
printf("case 2");
break;
case 3:
case 4:
case 5:
printf("case 3 or 4 or 5");
break;
default:
printf("Wrong choice");
break;
}
答案 1 :(得分:3)
C中的switch
由一组必须包含语句的案例标签组成。简而言之,语句以;
终止。代码如
switch (n){
case 4:
case 5:
}
无效,因为没有要执行的语句。 这就是给你一个编译错误。一个解决方法就是编写
switch (n){
case 4:
case 5:
;
}
其中;
表示空语句。请注意,C
中的切换具有后续功能,这意味着case4
会遇到case5
。这就是为什么你不需要case4
之后的空语句。
更好的是,只需删除这些案例。
答案 2 :(得分:2)
您必须指定案例5(和案例4)应该发生的事情;现在什么都没有,这就是它所抱怨的 - 你给了它一个案例标签,但没告诉它该怎么办。
如果您不希望发生任何事情,可以将案例从交换机中取出。
答案 3 :(得分:1)
复合语句末尾的标签是case 5:
,无需执行任何操作。你需要的是至少break
:
case 4:
case 5:
// do nothing
break;
现在关于语法 - 它看起来确实是错误的。首先 - 如果代码不需要额外的括号。第二 - 除非你想要“落入”下一个案例分支,否则你需要在每个块的末尾break
。如果你愿意,可以添加一条注释,说明如下:
case 1:
do_something();
break;
case 2:
do_something_else();
/* fall-through */
case 3:
and_something_else_more();
break;
case 42:
if (allow_easter_eggs) // like this
printf("DON'T PANIC\n");
break;
如果是1,则do_something()
执行do_something_else()
;如果是2,则执行and_something_else_more()
and_something_else_more()
,而{3}只执行default
。
最后,添加{{1}}标签也是个好主意。