【问题标题】:integer is not getting typecasted to bool in c++整数没有在 C++ 中被强制转换为 bool
【发布时间】:2017-06-14 09:35:40
【问题描述】:

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

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。 附言: 而不是 ||我也试过 |因为这是按位运算符,但仍然出现运行时错误。请有人帮我解答。

【问题讨论】:

  • C++ bool 有两个值 truefalse 映射到 10
  • 你为什么期待bool的演员表?运营商 ^ 不期望 bool
  • 请描述一下这个函数实际上应该做什么。
  • 运行时错误可能是由类型转换(即编译时)以外的其他原因引起的,可能是对数组的越界访问。还要注意(dp[i][j])^(dp[i-a[j-1]][j-1])(二进制异或)不等同于(dp[i][j])||(dp[i-a[j-1]][j-1])(逻辑或,或者甚至是二进制或)。如果您想将值用作布尔值并需要逻辑异或,您也可以使用(dp[i][j]) != (dp[i-a[j-1]][j-1])
  • 此代码中没有强制转换。问题是关于转化

标签: c++ boolean bitwise-or typecasting-operator


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 实际上,运行时错误即将到来ehenevr 返回类型是int,不知道我使用哪个运算符,是它|或 ||或 ^,但如果返回类型为 bool,则相同的代码运行良好。所以我的问题是为什么会这样?
  • 这很奇怪。您能否在返回bool 的版本中重新测试,如果您在上述行中使用^|,它真的不会崩溃吗?
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2015-12-19
  • 2019-09-02
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多