For循环,如果if语句未评估

时间:2019-09-15 20:08:54

标签: c++

我有一个遍历地图内容的函数,如果找到匹配的值,则会打印该键。

void returnFriendlyName(int input)
{
    std::map<std::string, int>::iterator it;

    for (it = friendlyName_id.begin(); it != friendlyName_id.end(); it++)
        if (it->second == input)
            std::cout << '\n' << "The Friendly Name for id:" << input << " is " << it->first << '\n' << '\n';
        else if (it == friendlyName_id.end())
            std::cout << "Sorry, that id does not exist.";
}

但是,如果我提供的输入与地图中的值不匹配,则 else if 语句不会评估。

这使我感到困惑,因为当输入与值不匹配时,我对循环的理解如下:

  1. 已初始化
  2. 经过条件测试
  3. 如果条件为真,则
  4. 递增
  5. 最终会增加到 friendlyName_id.end(),然后再次评估 条件
  6. 现在应该评估
  7. else if 语句

我对此代码的理解不正确吗?我是否遗漏了导致否则无法评估的内容?

修改

也许我措辞不好。我要做的是在我的函数不匹配地遍历整个地图的情况下输出一条错误消息。

但是我不想每次 输出该错误消息,即检查输入是否匹配。

我试图编写一条elseelse if语句,该语句仅在地图中没有匹配项时才执行一次

2 个答案:

答案 0 :(得分:2)

只要您的it到达friendlyName_id.end(),循环就结束了(根据循环的条件),并且您将永远不会到达循环中的这一部分。

void returnFriendlyName(int input)
{
    std::map<std::string, int>::iterator it;

    for (it = friendlyName_id.begin(); it != friendlyName_id.end(); it++) {
        if (it->second == input) {
            std::cout << '\n' << "The Friendly Name for id:" << input << " is " << it->first << '\n' << '\n';
            break;
        }
    }
    if (it == friendlyName_id.end()) std::cout << "Sorry, that id does not exist.";
}

还有一件事情,请注意,函数的名称为returnFriendlyName,这意味着返回一个可以继续使用的值,这里您要做的就是打印此(可能很重要)的信息。要更改此设置,请更改函数的签名:

void returnFriendlyName(int input)

类似:

string returnFriendlyName(int input)

并添加一个return语句:

string returnFriendlyName(int input)
{
    std::map<std::string, int>::iterator it;
    string result = "not-found";

    for (it = friendlyName_id.begin(); it != friendlyName_id.end(); it++) {
        if (it->second == input) {
            std::cout << '\n' << "The Friendly Name for id:" << input << " is " << it->first << '\n' << '\n';
            result = it->first;
            break; // return result;
        }
    }
    if (it == friendlyName_id.end()) // Unnecessary condition if you used the return statement instead of the `break` inside the loop, because in this case you won't reach this part of the function if the element exists in the list.
        std::cout << "Sorry, that id does not exist.";
    return result;
}

答案 1 :(得分:1)

  

我对此代码的理解不正确吗?我是否遗漏了导致其他项目无法评估的内容?

是的,这是不正确的。 else子句用于if,而不是for

您可能会对其他语言(例如Python语言)的else子句感到困惑。

如果添加大括号,您将清楚看到它。这是等效的:

void returnFriendlyName(int input)
{
    std::map<std::string, int>::iterator it;

    for (it = friendlyName_id.begin(); it != friendlyName_id.end(); it++) {
        if (it->second == input)
            std::cout << '\n' << "The Friendly Name for id:" << input << " is " << it->first << '\n' << '\n';
        else if (it == friendlyName_id.end())
            std::cout << "Sorry, that id does not exist.";
    }
}

顺序为:

  1. 已初始化
  2. 已针对循环条件进行了测试。如果为假,请退出。
  3. 循环主体运行,其中包括ifelse if
  4. 已递增
  5. 跳回2