【问题标题】:true/false regarding for and switch关于 for 和 switch 的真/假
【发布时间】:2014-02-27 12:21:17
【问题描述】:

在一本 C 书籍中,有一个真/假问题,其中以下两个陈述被描述为真。

1) 编译器为 switch 中使用的 case 实现跳转表。

2) 如果我们希望循环中的语句至少执行一次,可以使用 for 循环。

关于这两点我有以下问题:

  • 1号语句是什么意思?

  • 在我看来,第二个陈述应该是错误的,因为对于这个任务,我们使用了do while 循环。我说的对吗?

【问题讨论】:

    标签: c for-loop switch-statement


    【解决方案1】:

    如果用这样的措辞,第一点有点误导。当然,这可能就是重点。 :)

    它指的是为switch 语句生成快速代码的一种常用方法,但绝对不需要编译器这样做。即使是那些这样做的人,也可能不会总是这样做,因为必然会有权衡,这可能只会让switch 值得拥有超过 n 个案例.此外,案例本身通常必须是“紧凑的”,以便提供在表中使用的良好索引。

    是的,如果您想要至少一次迭代,可以使用do 循环,因为它在最后进行测试,而forwhile 都在开始时进行。

    【讨论】:

      【解决方案2】:

      1) 这意味着一个常见的优化是编译器构建一个“跳转表”,它就像一个数组,其中的值是程序接下来将执行的指令的地址。该数组的构建使得索引对应于被打开的值。使用这样的跳转表是 O(1),而级联的“if/else”语句在案例数量上是 O(n)。

      2) 当然,您可以使用“do-while”循环“至少执行一次”。但是您会发现 do-while 循环在大多数应用程序中并不常见,而“for”循环是最常见的——部分原因是如果您省略括号之间的第一和第三部分,它们实际上只是花哨的“while”循环!例如:

      for (; i < x; ) // same as while (i < x)
      for (i = 0; i == 0 || i < x; ) // like i = 0; do ... while (i < x)
      

      【讨论】:

      • 对于您的第 2 点:我们还可以使用 while 循环至少执行一次。但实际上只有 do-while 循环会强制执行此操作。
      • 你能用一个小程序解释一下你的第二点吗?请
      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多