【问题标题】:How to know that the loop was breaked early? [closed]如何知道循环被提前打破了? [关闭]
【发布时间】:2023-12-04 13:53:01
【问题描述】:
for(int i=0; i<len_arr; i++)
    if(arr[i] == some_num){
        printf("The idx of %d is: %d\n", some_num, i);
        break;
    }
if(i == len_arr)
    printf("Number not found.\n");

这不起作用。因为 i 不能在循环外访问。

我想了两种方法来达到我想要的效果。

但我的问题是,还有其他更优雅的方式来实现效果吗?

方式一:

int i;
for(i=0; i<len_arr; i++)
    if(arr[i] == some_num){
        printf("The idx of %d is: %d\n", some_num, i);
        break;
    }
if(i == len_arr)
    printf("Number not found.\n");

方式二:

for(int i=0; (i<len_arr) && (printf("Number not found.\n")); i++)
    if(arr[i] == some_num){
        printf("The idx of %d is: %d\n", some_num, i);
        break;
    }

【问题讨论】:

  • 我会投票给 Way1。或者添加一个布尔标志,它不是那么优雅,但清楚地说明了你想要做什么。
  • 你确定你的第二种方法有效吗?
  • 第一个问题..为什么不创建自己的“for循环”范围。只是放括号。我错过了什么吗?
  • 方式 2 对我来说看起来很优雅。
  • @UzumakiIchigo 只要您想在循环的每次迭代中打印Number not found.,它就很优雅。条件需要是||,而不是&amp;&amp;;在尝试编写这样的聪明代码时很容易犯这样的错误。 @Jennya C 还是 C++?显然,两种语言在数组中查找元素的惯用方法不同。

标签: c++ c++11 c99 c++14


【解决方案1】:

如果你不能轻易表达这一点,就不要使用循环。在这种具体情况下,您可以使用专用功能进行搜索。

auto start = arr;
auto end = arr + len;
auto val = std::find(start,end,some_num);
if (val != end)
   printf("The idx of %d is: %d\n", some_num, std::distance(start,val));
else
   printf("Number not found.\n");

【讨论】:

  • 最优雅的方式。
【解决方案2】:

我发现 Luka Rahne 的解决方案最符合思想。

如果你真的想做循环,你可以这样做:

for(size_t i(0); i <= len_arr; ++i)
{
    if(i == len_arr)
    {
        std::cout << "Number not found." << std::endl;
    }
    else if(arr[i] == some_num)
    {
        std::cout << "Found " << some_num << " at index: " << i << std::endl;
        break;
    }
}

【讨论】:

    【解决方案3】:

    有很多方法可以实现这一目标。我以前是这样的:

    bool found = false;
    for(int i=0; i<len_arr; i++)
    {
        if(arr[i] == some_num)
        {
            printf("The idx of %d is: %d\n", some_num, i);
            found = true;
            break;
        }
    }
    if(!found)
        printf("Number not found.\n");
    

    这个变体对我来说是最清晰/可读的。

    【讨论】:

    • 即使使用 Luka Rahne 的解决方案?
    • 嗯,问题是“如何知道循环提前中断了?”。我认为代码只是演示想法的示例,而不是“生产代码”。如果问题是“如何正确编写给定的代码?”,那么 Luka Rahne 的解决方案将是可行的方法。
    • @SergiiKhaperskov 你是对的。代码是一个演示。在我的真实情况下,我找不到任何东西。
    【解决方案4】:

    如果你不想像 Luka 建议的那样使用 std 并且只想做一个简单的循环,你可以像我一样做:

    int i;
    for(i = 0; i < len_arr && arr[i] != some_num; i++);
    if(i < len_arr)
        printf("The idx of %d is: %d\n", some_num, i);
    else
        printf("Number not found.\n");
    

    【讨论】:

      【解决方案5】:

      我个人不喜欢循环中断,这是我的解决方案:

      bool found = false;
      for(int i=0; i<len_arr && !found; i++){
          if(arr[i] == some_num){
              printf("The idx of %d is: %d\n", some_num, i);
              found = true;
          }
      }
      if(!found)
          printf("Number not found.\n");
      

      【讨论】: