C++ 为什么不执行continue语句?

C++ 为什么不执行continue语句?,c++,break,continue,C++,Break,Continue,为什么执行break语句而不执行continue语句 vector<int>val {2,3,4,-1,5,6,-1,56,234,-99,26,35,12,3,4}; for (auto name: val) { cout << name << endl; if (name == -1) continue; else if (name == -99) break; } std::cout命令的位置

为什么执行break语句而不执行continue语句

vector<int>val {2,3,4,-1,5,6,-1,56,234,-99,26,35,12,3,4};

for (auto name: val) {

    cout << name << endl;
    if (name == -1)
        continue;
    else if (name == -99)
        break;
}

std::cout命令的位置错误,如果所有条件都有错误,则必须显示。如果满足条件
name==-1
,则
continue
关键字指示在递增循环迭代器后立即返回for循环,因此在这种情况下不会调用cout命令行

for (auto name : val) {     
    if (name == -1) 
        continue;
    else if (name == -99) 
        break;
    cout << name << endl;
}
用于(自动名称:val){
如果(名称==-1)
继续;
else if(name==-99)
打破

cout在您的情况下,您应该仅在值通过IF-ELSE条件之后才打印它们。您甚至在检查值是-1还是-99之前就打印它们,因此从技术上讲,它将打印该向量中的所有内容,直到找到-99为止。

第一次执行将逐步进行

for
循环逐个迭代,并将每个元素与给定条件进行比较

反复比较
name==-1
如果为真,则
继续
执行操作 否则,如果
name==-99
break
将采取行动。然后您必须打印不满意的值

因此,您的代码将按如下方式工作

for(自动名称:val){
如果(名称==-1)
继续;
else if(name==-99)
打破


cout
coninue
语句不会执行,因为它是
for
循环中的最后一条语句,并且没有意义,所以优化器将其删除,以不生成超级
jmp
(或相关)操作。

是什么让你相信
continue
没有执行?你期望发生什么不同?怎么会?在检查其值之前打印
name
。你期望
continue
以某种方式追溯撤销上一条语句的效果吗?
-99
会出现在输出中,不是吗?为什么您对此很满意,但发现
-1
的存在令人惊讶吗?确实如此。
继续
跳到循环的开头,并开始处理下一个值。实际上,下一个值被愉快地打印出来了。又是什么问题呢?打印
-1
后,您希望发生什么?您首先打印
-1
,然后执行
continue
。首先打印
-99
,然后执行
break
continue
break
都不能回溯时间并撤消之前已执行的语句的效果。为什么要到-99?为什么不在-99之后,这些值都不会被删除displayed@Etchart因为<代码> EXCTORE。停止:循环。<:EtSalk -你确实需要得到一个基本的C++书籍。参见:@ Alxand SeruAudia>代码> Buffy<代码>确实停止了循环,但是99也不应该显示。不是吗?@ EtChult语句是在打印语句之后。C++代码按顺序执行,所以先打印数字,然后循环结束。gest使用调试器逐步检查代码,以查看程序的执行情况。您在此处归因于编译器的每个操作都是在运行时执行的,而不是由编译器执行的。编译器甚至在运行时都不存在,更不用说控制程序的执行了。并非“第一个编译器将比较\”name==-1\“”。编译器可能会先检查
else
条件。@user207421“您在此处归因于编译器的每个操作都是在运行时执行的,而不是由编译器执行的。”事实并非如此。编译器优化代码并删除冗余语句。为此,必须先执行这些条件。请注意,op询问“为什么不执行continue语句?”,声明未执行
continue
语句,这是optimizier在编译期间必须删除的。我试图解释执行过程。“为什么不执行continue语句?”.yes continue语句正在执行,但std::cout命令的位置错误。所以您的输出是这样的。所以我试图解释一下。不是关于编译器。不是问题的答案。问题是“为什么不执行continue语句?”。您应该将此评论写在评论部分,而不是作为答案。您认为原始代码中的
continue
没有任何作用,这是对的,但您可能应该更多地解释此更改显示问题的原因。没想到这个问题会引起如此多的关注。我认为这只是OP的打字错误。我编辑了slig我很想详细说明我的答案。@seccpur谢谢你的解释!我认为现在它是有意义的。然而,有时我写的一些代码,即使我把cout语句放在
if-else
station之前也行得通,但我想我应该把它放在
if-else
station之后,以减少出错的机会。为什么
continue
for
循环的最后一条语句。它的
break
是最后一条语句,并且它被执行。不是吗?@Etchart
continue
for
循环语句的
语句中
true
的最后一条语句,但不一定是
for
循环语句本身的
语句。而
初始状态在
语句true
语句false
之后都不会发生异常
语句true
可以在
语句false
之前发生,反之亦然。即使是似然属性,允许编译器针对特定语句进行优化,也不能确保
语句true
的顺序d
语句false
语句。尽管如此,编译器还是删除了
continue
语句,以及第一个
if
的整个
语句true
for (auto name : val) {     
    if (name == -1) 
        continue;
    else if (name == -99) 
        break;
    cout << name << endl;
}