我学C的时候,老师整天跟我说:“不要用goto,那是个坏习惯,很丑,很危险!”等等。
那么,为什么有些内核程序员会使用goto
,例如in this function , 可以用一个简单的
while(condition) {}
或
do {} while(condition);
我无法理解。在某些情况下使用 goto 代替 while
/do
-while
会更好吗?如果是这样,为什么?
最佳答案
历史背景:我们应该记住 Dijkstra 写了 Goto Considered Harmful 在 1968 年,当时很多程序员使用 goto
作为 structured programming 的替代品。 (if
、while
、for
等)。
44 年过去了,在野外很难找到这种 goto
的用法。很久以前,结构化编程就已经赢了。
案例分析:
示例代码如下所示:
SETUP...
again:
COMPUTE SOME VALUES...
if (cmpxchg64(ptr, old_val, val) != old_val)
goto again;
结构化版本如下所示:
SETUP...
do {
COMPUTE SOME VALUES...
} while (cmpxchg64(ptr, old_val, val) != old_val);
当我看到结构化版本时,我立即想到,“这是一个循环”。当我查看 goto
版本时,我认为它是一条直线,末尾有一个“重试”案例。
goto
版本在同一列上同时具有 SETUP
和 COMPUTE SOME VALUES
,这强调了大多数情况下,控制流通过通过两者。结构化版本将 SETUP
和 COMPUTE SOME VALUES
放在不同的列上,强调控制可能以不同的方式通过它们。
这里的问题是你想在代码中强调什么样的重点?您可以将此与 goto
进行比较以进行错误处理:
结构化版本:
if (do_something() != ERR) {
if (do_something2() != ERR) {
if (do_something3() != ERR) {
if (do_something4() != ERR) {
...
转到版本:
if (do_something() == ERR) // Straight line
goto error; // |
if (do_something2() == ERR) // |
goto error; // |
if (do_something3() == ERR) // |
goto error; // V
if (do_something4() == ERR) // emphasizes normal control flow
goto error;
生成的代码基本相同,因此我们可以将其视为排版问题,例如缩进。
关于c - 为什么有些内核程序员使用 goto 而不是简单的 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13001067/