Остановка цикла for C++
Следующий код должен выводить [0, 1], если следовать следующему условию:
Именно для этого во втором цикле for указан break, чтобы избежать нахождения следующих индексов, но почему-то код выводит и [0, 1] и [1, 0]. Задание прикреплено снизу.
int main() {
std::cout << "Enter size:" << std::endl; int size; std::cin >> size;
int* nums = new int[size];
std::cout << "Enter el-s:" << std::endl;
for (int i{ 0 }; i < size; i++)
{
std::cin >> nums[i];
};
std::cout << "Enter target:" << std::endl; int target; std::cin >> target;
for (int i{ 0 }; i < size; i++)
{
for (int j{ 0 }; j < size; j++)
{
if (nums[i] + nums[j] == target)
{
std::cout << "[" << i << ", " << j << "]" << std::endl;
break;
}
}
}
delete[] nums;
}
(Задание сделано неправильно с точки зрения решения на литкоде, но вопрос в другом)

Ответы (4 шт):
Автор решения: Qwertiy
→ Ссылка
break выходит только из самой вложенной конструкции. Чтобы прервать внешний цикл используй goto:
for (int i ...)
for (int j ...)
if (...)
goto DONE;
DONE:
...
Кстати, иногда бывает полезно обернуть метку в if (false):
if (0)
{
DONE:
...
}
Автор решения: NunOfIt
→ Ссылка
bool key;
for(...) {
for(...)
if(...) {
...
key = true;
break;
}
if (key) break;
}
Автор решения: Harry
→ Ссылка
Не столько для применения, сколько для полноты коллекции :)
try {
for (int i ...)
for (int j ...)
if (...) throw что-то
} catch(что-то)
{}
Автор решения: CrazyElf
→ Ссылка
А мне нравится вариант с выносом такого кода в отдельную функцию, тогда можно просто return из функции сделать:
void iterate(int* nums, int size, int target)
{
for (int i{ 0 }; i < size; i++)
{
for (int j{ 0 }; j < size; j++)
{
if (nums[i] + nums[j] == target)
{
std::cout << "[" << i << ", " << j << "]" << std::endl;
return;
}
}
}
}