为什么在 while 循环中返回表达式不起作用

Why return expression in while loop doesn't work

本文关键字:返回 表达式 不起作用 循环 while 为什么      更新时间:2023-10-16

下面的代码是count int m可以由数组数据中的哪个数字组成,但是退出的return 0;表达式不起作用,它会发生堆栈损坏,我必须使用exit(0);,为什么?

#include <iostream>
#include <cstdlib>
void increase(bool seq[], int size);
constexpr int n = 5;
int main()
{
int m, data[n];
bool seq[n];
std::cin >> m;
for (int i = 0; i < n; ++i) {
std::cin >> data[i];
seq[i] = false;
}
while (true) {
bool isEnd = true;
for (int i = 0; i < n; ++i)
if (!seq[i])
isEnd = false;
if (isEnd) {
std::cout << "IMPOSSIBLE!!!";
return 0;
}
int sum = 0;
for (int i = 0; i < n; ++i)
if (seq[i])
sum += data[i];
if (sum == m) {
for (int i = 0; i < n; ++i)
if (seq[i])
std::cout << data[i] << " ";
std::cout << std::endl;
return 0;
}
increase(seq, n);
}
}
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}

此代码不正确

void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}

它应该是

void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size - 1; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}

大小为 N 的数组的有效索引为 0 到 N - 1(含(。

这是有争议的,但你可以increase

解决这个问题
for (int i = size; i --> 0; /*intentionally blank*/){

这样做的好处是它也适用于unsigned类型。-->幻灯片运算符,当然,根本不是真正的运算符,而是--后跟>.

并非所有软件公司都允许这样做。我愿意。也许那是因为我更像是一个数学程序员,随着我长大,我发现这是一种倒计时到零的惯用方式,尤其是对于unsigned类型,我认为你的sizei应该是 - 在这种情况下,i >= 0总是true的。