【问题标题】:Unexpected behavior of C++ boolean function and impossible returnC++ 布尔函数的意外行为和不可能的返回
【发布时间】:2015-11-29 19:32:12
【问题描述】:

我刚刚遇到了以下代码的一个极其奇怪的结果。

#include <iostream>
using namespace std;
const int N = 3;

bool gen(int l1, int l2, int p) {
    if(p == N-1) {
        if (l1 == l2) {
            cout << "sth";
            return false;
        }   
    }
    else
        return gen(l1+1, l2, p+1) || gen(l1, l2+1, p+1));
}

int main() {
    if(gen(0,0,0)) cout << "yes";
    else cout << "no";

    return 0;
}

该程序完全没有做任何事情,它只是一个模拟。为什么它每次都写yes,即使我不允许它在任何地方这样做。此外,输出不包含“sth”字。另外,当我改变时:

cout << "sth";
return true;

进入:

cout << "sth";
return false;

它仍然产生"yes" 作为输出。

怎么会这样?

【问题讨论】:

  • 您的代码调用了 UB。如果l1 != l2 而是p == N-1,它不会返回值。您的编译器通常应该对此发出警告——密切注意这些警告。

标签: c++ return return-value


【解决方案1】:

问题在于,如果p == N-1l1 != l2,您的函数将退出而不会实际命中return。如果将其设置为合理的警告级别,您的编译器会警告您。

这会触发未定义的行为,因此可能会发生任何输出。 (例如,我用 clang 得到“不”。)

【讨论】:

  • 我知道它不能返回任何东西,但我不知道它会导致这样的事情。我以为是关于||运算符。
猜你喜欢
  • 2022-01-10
  • 2019-08-08
  • 2012-07-15
  • 2015-04-12
  • 1970-01-01
  • 2016-09-18
  • 2021-09-08
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多