如何知道环路提前被打破了?

How to know that the loop was breaked early?

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;
    }

有很多方法可以实现这个目标。我曾经这样做过:

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");

我觉得这个变体最 clear/readable。

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

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");

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

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");

我发现 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;
    }
}

如果你不想像 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");