(VC 2019) C++ return 语句在发布配置中被忽略,在调试中工作正常

(VC 2019) C++ return statement ignored in release configuration, works fine in debug

我有这段简单的代码:

#include <iostream>
#include <vector>

bool sequence_increase(std::vector<int>& sequence, const int& index) {
    if (index >= sequence.size()) return true;
    if (sequence[sequence.size() - index - 1] < 2 * index) {
        sequence[sequence.size() - index - 1]++;
        return false;
    }
    else {
        if (index == sequence.size() - 1) return true;
        else {
            sequence[sequence.size() - index - 1] = 0;
            sequence_increase(sequence, index + 1);
        }
    }
}

void pairing(std::vector<int> list, const std::vector<int>& sequence) {
    std::vector<int> list_copy;
    for (int i = 0; i < sequence.size(); i++) {
        int a, b; a = list[0];
        list.erase(list.begin());
        b = list[sequence[i]];
        list.erase(list.begin() + sequence[i]);
        std::cout << "(" << a << ", " << b << ")";
    }
    std::cout << std::endl;
}

void pairings(const int& n) {
    std::vector<int> list(2*n);
    std::vector<int> seq; seq.resize(n);
    for (int i = 0; i < 2 * n; i++) list[i] = i + 1;
    bool quit = false;
    while (!quit) {
        int index = 0;
        std::cout << "sequence: ";
        for (auto& s : seq) std::cout << s << " "; std::cout << std::endl;
        std::cout << "pairing: ";
        pairing(list, seq);
        quit = sequence_increase(seq, index);
        std::cout << "quit? " << quit << std::endl;
    }
}

int main() {
    pairings(2);
}

为了解释,我想生成一个包含 $2n$ 个元素的列表的所有配对,例如

(12)(34)
(13)(24)
(14)(23)

映射采用 $n$ 个数字序列,其中位置 $n-k$ 上的数字仅上升到 $2k-1$(或者,在我的代码中,从 0 到 $2k-2$)。然后这个数字序列在函数 void pairing 中被翻译成唯一的一对,据我所知,这工作正常。

为了生成序列中所有可能的组合,我使用函数 bool sequence_increase 帮助自己,它接受一个通用序列并将其增加 1

320 -> 400

(这里最后的0已经是最大值了,之前的2也是,所以把它们归零,然后从3增加到4)

顺序是这样的

000
010
020
100
110
120
200
..

(较长的序列类似)

要知道什么时候停止是什么时候打算增加的位置越界,这是由if (index == sequence.size() - 1) return true;在函数sequence_increase中提前一步确保的,这表明它不能再增加了。这将存储在函数对中的变量 quit 中,这应该会停止 while(!quit) 循环。

这是问题所在:程序在调试模式下运行良好(VC 2019),这是最后一些成功的输出:

如您所见,例程返回 true,while 循环结束,程序结束。

但是,在发布模式下,例程 sequence_increase 永远不会 returns 为真,因此它永远不会结束

我无法理解它。可能是什么原因?我怎样才能使它在发布配置上工作?谢谢。

问题是您从未return低于

的值
 else
 {
         sequence[sequence.size() - index - 1] = 0;
         sequence_increase(sequence, index + 1);
 }

因为 Release模式在其下执行一个逻辑过程,你必须return sequence_increase(sequence, index + 1);就像Johnny Mopp 说(感谢他分享技巧)结束循环到 return true.

建议

所以改用这个:

bool sequence_increase(std::vector<int>& sequence, const int& index) {
    if (index >= sequence.size()) return true;
    if (sequence[sequence.size() - index - 1] < 2 * index) {
        sequence[sequence.size() - index - 1]++;
        return false;
    }
    else {
        if (index == sequence.size() - 1) return true;
        else {
            sequence[sequence.size() - index - 1] = 0;
            sequence_increase(sequence, index + 1);
            return sequence_increase(sequence, index + 1);
        }
    }
}