整数在 C++ 中没有被类型转换为 bool

integer is not getting typecasted to bool in c++

编码时遇到运行时错误。这是我的代码:

int f(int a[],int n,int sum)
{
    int dp[sum+1][n+1];
    for(int i=0;i<=n;i++)
    dp[0][i]=1;

    for(int i=1;i<=sum;i++)
    dp[i][0]=0;

    for(int i=1;i<=sum;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dp[i][j]=dp[i][j-1];
            if(i>=a[j-1])
            dp[i][j]=(dp[i][j])^(dp[i-a[j-1]][j-1]);
        }
    }

    return dp[sum][n];
}

这里的总和总是正数。经过大量调试后我无法得到答案所以在匹配我的解决方案答案之后。这就是答案。

bool f(int a[],int n,int sum)
{
    bool dp[sum+1][n+1];
    for(int i=0;i<=n;i++)
    dp[0][i]=true;

    for(int i=1;i<=sum;i++)
    dp[i][0]=false;

    for(int i=1;i<=sum;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dp[i][j]=dp[i][j-1];
            if(i>=a[j-1])
            dp[i][j]=(dp[i][j])||(dp[i-a[j-1]][j-1]);
        }
    }

    return dp[sum][n];
}

所以我的问题是为什么int不能转换为bool。 P.S。 : 而不是 ||我也试过 |因为这是按位运算符,但我仍然遇到运行时错误。有人请帮我得到答案。

运行时错误最可能的原因似乎是行

dp[i][j]=(dp[i][j])^(dp[i-a[j-1]][j-1]);

而且最有可能是 dp[i-a[j-1]],它根据 a 数组中的值获取索引。这很容易导致 dp 被负值索引。

这种怀疑也得到以下事实的支持:它 "works" 与 ||(逻辑或)但不适用于 ^|(二元运算符) ).这是因为逻辑运算符具有短路评估(如果 dp[i][j] 为真,则第二个运算符不需要并且根本不被评估),而二元运算符总是评估两个操作数。

所以似乎在 || 的情况下,第二个操作数没有被评估,因此它不会崩溃,而对于二元运算符,它被评估并且索引超出范围并使应用程序崩溃。