首页 > 解决方案 > 为什么while循环中的返回表达式不起作用

问题描述

下面的代码是count int m可以由数组数据中的哪个数字组成,但是return 0;exit的表达式不起作用,它会发生堆栈损坏,我必须使用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];
        }
    }
}

标签: c++

解决方案


此代码不正确

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(含)。


推荐阅读