"打破;" 出于"if"声明?

Nic*_*dis 31 c

你能否突破if语句或是否会导致崩溃?我开始熟悉C,但这似乎有争议.第一张图片来自C上的一本书("Head First C"),该片段显示的是哈佛大学CS班级工作人员编写的代码.究竟是怎么回事并且与C标准有关?

如果陈述,休息不会破坏.

1990年1月15日,AT&T的长途电话系统崩溃,6万人失去了电话服务.原因?处理交换机中使用的C代码的开发人员试图使用a break来打破if声明.但是break,不要突破ifs.相反,该程序跳过了整段代码,并引入了一个错误,该错误在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,whiledo .. 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)

不同之处在于,continuebreak与编译器自动放置的虚拟标签进行交互.这类似于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;改为使用.