【问题标题】:Warning: Function will always return True [closed]警告:函数将始终返回 True [关闭]
【发布时间】:2014-06-19 19:38:51
【问题描述】:

我有一个 isPrime 函数,它总是返回 true,不管输入的数字是多少。这对于我的程序中的其他几个布尔函数也是一样的。

我的简单 isPrime 函数:

bool isPrime(mpz_class num)
{
    bool prime = true;

    for (int i=2; i<num; i++)
        if (num % i == 0)
            prime = false;
    return prime ;
}

调用它(我怀疑这是问题所在,但我不知道问题是什么):

do
    {
        do
        {
            cout << "Enter Prime 1: ";
            getline(cin, sa);
            isNum(sa);
            firstPrime = sa;
        }
        while(!isNum);
    isPrime(firstPrime);
    }
    while(!isPrime);

isNum 函数也每次都返回“true”。

运行时错误:

warning: the address of 'void isNum(std::string)' will always evaluate as 'true' [-Waddress]|

有人看到问题了吗?

【问题讨论】:

  • 你能告诉我们isNum()吗?
  • 您认为!isPrime!isNum 会做什么?这些是函数,它们接受参数。此外,错误消息是 not 告诉您该函数将始终返回 true。它告诉你一些不同的东西。
  • while(!isPrime) 错误是指这一行,您正在检查该函数的地址是否等于零(永远不会是这种情况)。
  • 你需要复习一下如何使用函数及其返回值。
  • 函数调用需要括号。 isPrime 引用函数并计算其地址;它没有调用它。 isPrime(n) 将是一个电话。一旦你解决了这个问题,你就需要清理你的程序逻辑。

标签: c++ function boolean


【解决方案1】:

您需要存储调用 isNum() 的返回值,然后才能在 while 中检查它。你现在在做什么

    while(!isNum)

是您正在检查函数的地址而不是返回类型。你的意思可能是这样的:

    bool isPrimeRetVal;
    do
    {
        bool isNumRetVal;
        do
        {
            cout << "Enter Prime 1: ";
            getline(cin, sa);
            isNumRetVal = isNum(sa);
            firstPrime = sa;
        }
        while(!isNumRetVal);
        isPrimeRetVal = isPrime(firstPrime);
    }
    while(!isPrimeRetVal);

注意与 while(!isPrime) 相同的问题。

【讨论】:

  • 不需要这些retval 变量。你可以只调用while条件中的函数
  • 是的,确实如此。但是,它仍然说明了这一点。
【解决方案2】:

您忽略isPrime 的返回值,而是检查isPrime(它不会改变,它始终是一个有效的函数)。

【讨论】:

    【解决方案3】:

    您不是通过仅提及其名称来调用该函数,例如与while (!isNum)

    该上下文中的函数名计算为指向该函数的指针。由于所有非空指针都计算为布尔值true,并且指向任何函数的指针不能等于空指针,所以isNum 总是计算为true,而!isNum 总是为假。

    而不是这个:

    do { ... isPrime(x); } while (!isPrime);
    

    你需要写一些更像这样的东西:

    do { ... } while (!isPrime(x));
    

    【讨论】:

      【解决方案4】:

      这两行:

      isPrime(firstPrime);
      
      while(!isPrime);
      

      结合建议您不清楚 C++ 中函数的调用方式。第一行调用该函数,然后将结果丢弃。第二行甚至不调用函数,它只是查看它的地址(永远不会为零)。

      你可能想要:

      while(!isPrime(firstPrime));
      

      这会将firstPrime传递给函数,然后查看函数的返回值。

      【讨论】:

        【解决方案5】:

        您没有使用 isPrime 函数的返回值。 IsPrime 是一个函数,您应该将其值存储在某个变量中并在 while 循环中使用该变量。

        isNum 变量也是如此。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-02
          • 1970-01-01
          • 2011-05-09
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多