0

更新:感谢您的帮助。编写一个可以运行的演示确实帮助我解决了这个问题,但不是以我预期的方式。我认为这是编译器优化而不是错误。当 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 )。

我在这里做错了什么?

4

1 回答 1

1

“当它跳出循环时,控制返回到第一个条件语句( if (something) )。”

当它跳出循环时,它刚刚设置bfalse,因此if (b == true)代码不会运行。我有什么误解?

编辑:我认为你过度简化了你的代码。显然,这不是您实际运行的代码,因为str它从来没有价值。您需要发布一个我们可以实际运行的示例(但是一旦您创建了这样的示例,您可能会自己发现错误。:-))

于 2013-05-23T17:21:42.517 回答