【问题标题】:Change the switch statement key in a case, allowed? [duplicate]在 case 中更改 switch 语句键,允许吗? [复制]
【发布时间】:2014-02-23 21:24:42
【问题描述】:

它会起作用/是否允许使用 switch-case 语句并更改语句中的键?

例如:

temp = 1

switch(temp)
{
    case 1:
         temp = 2;
         //Do something with temp..
    break;
}

这样做的意义在于我不必创建另一个变量,而且在我的程序中这样做也很有意义。我不是要在 switch-case 语句中更改为另一种情况,只要允许重用用作键的变量而没有任何副作用。

【问题讨论】:

  • 是的,它会按预期工作。
  • 你可以在这里看到:stackoverflow.com/questions/8333701/…
  • 你的观点毫无意义。只需创建另一个变量。它不会受到伤害,它使您的代码更易于他人阅读和理解。将详细信息留给您的编译器。
  • 这可行,但您应该几乎肯定会创建另一个变量。你似乎在重复使用一个——但有无穷无尽的供应,所以没必要吝啬它们。几乎所有变量都应该被考虑(或实际制作)const。 (编辑:这条规则的大例外:状态机,正如几个答案所指出的那样。我怎么会忘记这一点?)
  • 开关只是对 case 的二分查找和代码的跳转。一旦跳转完成, switch 语句就没有进一步的效果,所以改变变量就可以了。我在嵌入式系统中经常这样做:在 case 结束时将 switch 变量设置为下一个 case 的值并退出函数,以便稍后再次调用它时,它将从中断的地方重新开始。

标签: c++ c switch-statement


【解决方案1】:

这很好。几乎地球上的每个状态机都在做一些与你在这里所做的相当的事情。

【讨论】:

    【解决方案2】:

    是的,你可以这样做。其实下面是写lexers的常用做法:

    int c = getc(file);
    switch(c)
    {
    case '+':
        c = getc(file); // < `c` modified here!
        switch(c)
        {
        case '+': return OP_INC;
        default: ungetc(c, file); return OP_ADD;
        }
    ...
    }
    

    【讨论】:

    • 这类似于我正在做的事情,重用同一个变量而不是多个变量是有意义的(在我看来,这使得代码更难理解,尽管很多人对此发表了相反的评论问题)。
    • 在这种情况下,请重复使用!您并没有真正提供上下文,所以人们只是认为您试图将变量重用于完全不同的目的(这被认为是不好的做法)。
    • 我同意,但人们往往不会按原样回答所提出的问题。我只问这是否合法,不是一个好方法;)我会尽快接受你的回答。
    【解决方案3】:

    虽然使用相同的变量不是一个好主意,但是代码会起作用,因为分支是在评估 switch 语句中的表达式时确定的。

    【讨论】:

    • 这不是未定义的行为。为什么这不是一个好主意?
    • @Jerry Jeremiah 有时这样的代码会让读者感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多