这段代码中的“继续”是如何工作的?

Posted

技术标签:

【中文标题】这段代码中的“继续”是如何工作的?【英文标题】:How does “continue" work in this code? 【发布时间】:2013-07-11 06:11:03 【问题描述】:
while ( fgets(eqvline, 1024, eqvfile) != NULL ) 

    eqvline[strlen(eqvline)-1] = '\0';

    if (!strcmp (eqvline, "$SIGNALMAP")) 
        start_store_mask = 1;
        continue;
    

    if (!strcmp (eqvline, "$SIGNALMAPEND")) 
        _num_mask_pins = i;
        sim_inform ( sim, "[vTPSim] Total of %d pins found in equivalent file.\n", _num_mask_pins);
        //return;
        start_store_mask = 0;
    

你能解释一下这段代码中的continue; 是如何工作的吗?当continue;被执行时,代码会跳转到哪里?再次比较读取新行的eqvline?那么这个代码if (!strcmp (eqvline, "$SIGNALMAPEND")) 什么时候会被调用呢?

【问题讨论】:

当 continue 被调用时 主体中的其余语句被忽略,并在循环顶部继续执行,并评估循环的测试(在您的情况下为 fgets)。 @Jonathan Leffler 谢谢指正。抱歉我的英语不好。 【参考方案1】:

continue 语句将控制权传递给 它出现的最近的封闭 do、for 或 while 语句, 绕过 do、for 或 while 语句中的任何剩余语句 身体。

在您的代码中,在执行continue; 之后,会立即检查while 循环的条件。

如果条件满足,控制进入循环内部。首先

 eqvline[strlen(eqvline)-1] = '\0';

被执行。

然后,声明

 if (!strcmp (eqvline, "$SIGNALMAP"))

被执行。

【讨论】:

【参考方案2】:

不,不会。 continue 跳转到循环的开头,即。 e.首先将测试条件(因为while 构造测试之前 执行,不像do-while),所以你将在continue 之后立即执行的是

fgets(eqvline, 1024, eqvfile) != NULL

那么,根据这个表达式的值,

eqvline[strlen(eqvline)-1] = '\0';

或循环体之后的第一条语句。

【讨论】:

值得注意的是,如果代码是for 循环,那么continue 将继续使用reinitialization 中的reinitialization 代码?

以上是关于这段代码中的“继续”是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

无法理解循环中的“继续”功能是如何工作的? [关闭]

Javascript,IF 语句中的逗号 - 试图理解这段代码

flutter中的dio包如何在这段代码中加入base-url和url和apikey

对 struct 在这段代码中的工作方式感到困惑

有人能解释一下这段代码中的法线是如何计算的吗?

委托如何工作和委托在objective-c中的工作流程