您是否可以中断if语句,或者它是否会导致崩溃?我开始熟悉C语言,但这似乎是有争议的。第一张图片来自一本关于C语言的书("Head first C"),代码片段显示了由哈佛大学CS班级员工编写的代码。到底是怎么回事,和C标准有什么关系?
中断不会中断if语句。
1990年1月15日,AT&T的长途电话系统崩溃,6万人失去了电话服务。原因是什么?一位开发用于交易所中的C代码的开发人员试图使用break
来中断if
语句。但break
s并没有突破if
s,而是跳过了一整段代码,并引入了一个bug,在9个小时内中断了7,000万次电话通话。
for (size = 0; size < HAY_MAX; size++)
{
// wait for hay until EOF
printf("\nhaystack[%d] = ", size);
int straw = GetInt();
if (straw == INT_MAX)
break;
// add hay to stack
haystack[size] = straw;
}
printf("\n");
发布于 2014-07-12 15:38:43
无论是for
、while
还是do .. while
类型,break
都只与最近的封闭环路或交换机交互。它经常被称为伪装的goto,因为C中的所有循环实际上都可以转换为一组条件goto:
for (A; B; C) D;
// translates to
A;
goto test;
loop: D;
iter: C;
test: if (B) goto loop;
end:
while (B) D; // Simply doesn't have A or C
do { D; } while (B); // Omits initial goto test
continue; // goto iter;
break; // goto end;
不同之处在于,continue
和break
与编译器自动放置的虚拟标签交互。这类似于return
所做的事情,因为您知道它在程序流中总是会跳到前面。开关稍微复杂一点,生成标签和计算的goto数组,但break使用它们的方式是相似的。
通知提到的编程错误是将break
误解为与封闭块交互,而不是与封闭循环交互。考虑一下:
for (A; B; C) {
D;
if (E) {
F;
if (G) break; // Incorrectly assumed to break if(E), breaks for()
H;
}
I;
}
J;
有人认为,考虑到这样一段代码,G
会跳转到I
,但它会跳转到J
。预期的函数将改用if (!G) H;
。
发布于 2014-07-12 15:24:19
这实际上是break
语句的常规用法。如果break
语句没有嵌套在if
块中,那么for
循环只能执行一次。
MSDN将其作为break
语句的example列出。
发布于 2017-04-21 05:58:10
如前所述,break-statement只在中使用开关和循环。这是另一种实现所要求的内容的方法。我正在复制其他人没有提到的https://stackoverflow.com/a/257421/1188057。这只是一个涉及do-while循环的技巧。
do {
// do something
if (error) {
break;
}
// do something else
if (error) {
break;
}
// etc..
} while (0);
虽然我更喜欢使用goto-statement。
https://stackoverflow.com/questions/24714287
复制