更新:感谢您的帮助。编写一个可以运行的演示确实帮助我解决了这个问题,但不是以我预期的方式。我认为这是编译器优化而不是错误。当 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) )。
我尝试删除中断,而是设置 i = ( str.end() - 1 )。这导致了相同的行为 - 它返回到 for,确定它位于字符串的最后一个字符,然后再次将控制权返回到第一个条件语句,并按预期跳过 if ( z == true )。
我在这里做错了什么?