提问者:小点点

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


下面的代码是count int m可以由数组数据中的哪个数字组成,但是exit的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];
        }
    }
}

共2个答案

匿名用户

这个代码不正确

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(包括)。

匿名用户

这是有争议的,但是您可以在increas中用

for (int i = size; i --> 0; /*intentionally blank*/){

这样做的好处是,它还可以处理无符号类型。 -->是幻灯片运算符,当然,它根本不是真正的运算符,而是--后跟>

并不是所有的软件公司都允许这样做。 我有。 也许这是因为我更多地是一个数学程序员,并且随着我的成长,我发现它是一种惯用的倒数到零的方式,特别是对于无符号类型,我认为您的大小I应该是这样的--在这种情况下,I>=0将始终是true