当我编译我的程序时,为什么它会抱怨“复合语句末尾的标签”?

时间:2013-10-24 09:09:52

标签: c if-statement switch-statement

当我尝试编译代码时,我不断收到此错误消息:

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

4 个答案:

答案 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}}标签也是个好主意。