代码之家  ›  专栏  ›  技术社区  ›  Mike Fielden

C开关:不受其他情况限制的情况

  •  5
  • Mike Fielden  · 技术社区  · 16 年前

    这个问题是对这个的一种补充 question

    在C中,开关案例不能落入其他案例,这会导致编译错误。在这种情况下,我只是在所选月份及其后每个月的月份合计中添加一些数字。(简单的例子,不是真实的)

    switch (month)
    {
        case 0:
          add something to month totals
        case 1:
          add something to month totals
        case 2:
          add something to month totals
        default:
          break;
    }
    

    在C中是否有一种逻辑上的替代方法,而不必写出大量的if语句?

    if (month <= 0)
       add something to month
    if (month <= 1)
       add something to month
    if (month <= 2)
       add something to month
    .... etc
    
    5 回复  |  直到 13 年前
        1
  •  11
  •   Ben Scheirman    16 年前

    通常,当您看到一个巨大的switch语句或许多if语句可能落入多个块中时,您会试图抑制一个糟糕的设计。

    相反,如果您实现了规范模式以查看是否有匹配的内容,然后对其进行操作,会怎么样?

    foreach(MonthSpecification spec in this.MonthSpecifications)
    {
       if(spec.IsSatisfiedBy(month))
           spec.Perform(month);
    }
    

    然后你就可以添加不同的规格来匹配你想做的。

    很难说你的领域是什么,所以我的例子可能有点做作。

        2
  •  8
  •   jwarzech    16 年前

    在C switch语句中,只有在没有要通过的语句的情况下,才能通过事例。

    switch(myVar)
    {
       case 1:
       case 2: // Case 1 or 2 get here
          break;
    }
    

    但是,如果你想通过一个声明,你必须使用可怕的goto

    switch(myVar)
        {
           case 1: // Case 1 statement
                   goto case 2;
           case 2: // Case 1 or 2 get here
              break;
        }
    
        3
  •  1
  •   Adam Davis    16 年前

    你在添加常量吗?如果是这样的话,也许这样的东西可以工作(C语法):

    const int addToTotals[] = {123, 456, ..., 789};
    
    for(i=month;i<12;i++)
       totals += addToTotals[i];
    

    如果您需要比为后面每个月的总计添加常量更复杂的语句,那么可以对变量或函数指针执行类似的操作。

    -亚当

        4
  •  1
  •   Community CDub    7 年前

    已经有一个问题涉及这个主题:

    C# switch statement limitations - why?

    编辑:

    我要指出的主要目的是,先生们,两个名字相近的问题会给问题带来混乱。

        5
  •  0
  •   stealthyninja michkra    13 年前

    按相反顺序写入开关箱

    case 2:
    
    case 1:
    
    case 0:
    
    break;
    
    
    default:
    

    希望有帮助!