你能否突破if语句或是否会导致崩溃?我开始熟悉C,但这似乎有争议.第一张图片来自C上的一本书("Head First C"),该片段显示的是哈佛大学CS班级工作人员编写的代码.究竟是怎么回事并且与C标准有关?
如果陈述,休息不会破坏.
1990年1月15日,AT&T的长途电话系统崩溃,6万人失去了电话服务.原因?处理交换机中使用的C代码的开发人员试图使用a
break
来打破if
声明.但是break
,不要突破if
s.相反,该程序跳过了整段代码,并引入了一个错误,该错误在9个小时内中断了7000万个电话.
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");
Run Code Online (Sandbox Code Playgroud)
Yan*_*ier 39
break
仅与最接近的封闭循环或开关相互作用,无论它是for
,while
或do .. while
键入.它经常被称为变相goto,因为C中的所有循环实际上都可以转换为一组条件结果:
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;
Run Code Online (Sandbox Code Playgroud)
不同之处在于,continue
并break
与编译器自动放置的虚拟标签进行交互.这类似于return
你所知道的,它将始终在程序流程中跳跃.开关稍微复杂一些,生成标签数组和计算得到的数据,但是与它们一起工作的方式是相似的.
通知所引用的编程错误是误解break
为与封闭块相互作用而不是封闭循环.考虑:
for (A; B; C) {
D;
if (E) {
F;
if (G) break; // Incorrectly assumed to break if(E), breaks for()
H;
}
I;
}
J;
Run Code Online (Sandbox Code Playgroud)
有人认为,鉴于这样一段代码,G
会导致跳转I
,但它会跳转到J
.预期的功能将if (!G) H;
改为使用.