更新:谢谢你的帮助。编写一个可以运行的演示确实帮助我解决了这个问题,但不是以我期望的方式。我认为这是一个编译器优化,而不是一个bug。当if (z == true)中的代码被注释掉时,条件语句被完全跳过,控制返回到if (x)。如果我放入实际的代码,我们在适当的时候点击条件语句。
原始问题:我有一个std::string,我正在遍历它以确定它是否包含某些字符。如果找到这些字符中的任何一个,我希望退出for循环并继续执行下一个条件语句。下面是一个例子:
#include <iostream>
using namespace std;
int main()
{
bool x = true;
bool y = true;
bool z = true;
std::string str;
cout << "Enter string: ";
cin >> str;
if ( x )
{
if ( y )
{
std::string::iterator i;
for ( i = str.begin(); i != str.end(); i++ )
{
cout << "Enter for" << endl;
if ( *i == 'a' || *i == 'b' || *i == 'c' )
{
z = false;
cout << "Exit for" << endl;
break;
}
}
if ( z == true )
{
//cout << "z == true" << endl;
}
}
}
}
问题是程序永远不会碰到if (z == true)。当跳出循环时,控制返回到第一个条件语句(if (x))。
我尝试删除break,而不是设置I = (str.end() - 1)。这导致了相同的行为-它返回到for,确定它位于字符串的最后一个字符,然后再次将控制返回给第一个条件语句,按预期跳过if (z == true)。
我在这里做错了什么?
"当跳出循环时,控制返回到第一个条件语句(if (something))。"
跳出循环时,它刚刚将b
设置为false
,因此if (b == true)
代码不会运行。我误解了什么?
Edit:我认为你的代码过于简化了。显然,这不是你实际运行的代码,因为str
从来没有一个值。您需要发布一个我们可以实际运行的示例(但是一旦创建了这样的示例,您可能会自己发现错误)。: -)