C++ (VC 2019)C++;return语句在版本配置中被忽略,在调试中可以正常工作

C++ (VC 2019)C++;return语句在版本配置中被忽略,在调试中可以正常工作,c++,function,return,visual-studio-debugging,C++,Function,Return,Visual Studio Debugging,我有一段简单的代码: #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

我有一段简单的代码:

#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);
}
映射以$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
..
(较长的序列类似)

知道何时停止是指当预期的增加位置超出范围时,如果(index==sequence.size()-1)返回true,则
可以提前一步确保停止序列中的code>增加
,表示不能再增加。这将存储在函数对中的变量quit中,这将在(!quit)循环时停止

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

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

但是,在释放模式下,例程序列_increase永远不会返回true,因此它永远不会结束


我不能把我的头绕在它周围。原因可能是什么?我如何在发布配置上实现这一点?谢谢。

问题是,您从未在下返回值

 else
 {
         sequence[sequence.size() - index - 1] = 0;
         sequence_increase(sequence, index + 1);
 }
由于释放模式在该模式下执行逻辑过程,因此您必须返回
sequence\u increase(sequence,index+1)正如约翰尼·莫普(Johnny Mopp)所说的那样(感谢他分享这个技巧),结束循环返回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);
        }
    }
}
bool序列\u增加(标准::向量和序列,常量int和索引){
if(index>=sequence.size())返回true;
if(sequence[sequence.size()-index-1]<2*index){
sequence[sequence.size()-index-1]+;
返回false;
}
否则{
if(index==sequence.size()-1)返回true;
否则{
sequence[sequence.size()-index-1]=0;
顺序增加(顺序,指数+1);
返回序列_增加(序列,索引+1);
}
}
}

“原因可能是什么?”-未定义的行为可能是原因。例如,并非
bool sequence\u increase()
中的所有路径都返回
bool
值。您需要返回递归调用的结果:
return sequence\u increase(sequence,index+1)打开你的编译器警告,gcc有很多关于你的代码的东西要告诉你:(最后一个是最有趣的一个)或者更好的是,把它们当作错误对待,顺便说一句,VC 2019用默认设置报告问题。是的,没错。在此上下文中,将部件重写为else{sequence[sequence.size()-index-1]=0;return sequence_increase(sequence,index+1);}
index==sequence.size()-1
触发警告,当
sequence
没有元素时,它将导致问题(但无论如何,在这种情况下,上面的行已经有UB)
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);
        }
    }
}