在C书中有一个真/假的问题,其中以下两个陈述被描述为真。
1)编译器为交换机中使用的案例实现跳转表。
2)如果我们希望循环中的语句至少执行一次,则可以使用for循环。
关于这两点我有以下问题:
声明编号1的含义是什么?
据我所知,第二个语句应该是假的,因为对于这个任务,我们使用do while
循环。我是对的吗?
答案 0 :(得分:0)
第一点有点误导,如果措辞就像那样。当然,这可能只是重点。 :)
它指的是为switch
语句生成快速代码的一种常见方法,但绝对不要求编译器执行此操作。即使那些人也可能不这样做总是因为必然需要权衡利弊,这可能只会使switch
超过 n 案件。此外,案例本身通常必须是“紧凑的”,以便提供在表中使用的良好索引。
是的,如果你想要至少一次迭代,do
循环是使用什么,因为它在最后进行测试,而for
和while
都在启动。
答案 1 :(得分:0)
1)这意味着一个常见的优化是编译器构建一个“跳转表”,就像一个数组,其中值是程序下一步执行的指令的地址。构建阵列使得索引对应于正在接通的值。使用这样的跳转表是O(1),而“if / else”语句的级联在案例数中是O(n)。
2)当然,你可以使用“do-while”循环执行“至少一次”的操作。但你会发现do-while循环在大多数应用程序中相当罕见,而“for”循环是最常见的 - 部分是因为如果省略括号之间的第一和第三部分,它们实际上只是花哨的“而”循环!例如:
for (; i < x; ) // same as while (i < x)
for (i = 0; i == 0 || i < x; ) // like i = 0; do ... while (i < x)