模运算符导致的代码编译问题

时间:2019-07-03 07:03:22

标签: c++ c++11

我编写了一个程序,以数字形式将数字(由程序员预定义)存储在数组中。

例如,如果我要在数组arrx [4]中存储一个数字1234,则其元素为:

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4

我尝试使用以下代码来实现这一点:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int arrx[4];    // Stores the individual digits of number as array
    int digx = 4;   // Total number of digits in number
    int i;
    long int dupx = 1234;  // Number which has to be stored in array
    for(i = digx-1; i >= 0 ; i--)
    {
        arrx[digx-i-1] = int(dupx/pow(10,i));
        dupx = dupx%(pow(10, i));
    }
    return 0;
}

但是,当我尝试编译以上代码时,收到以下错误消息:

  

错误:类型为'long int'和'double'的无效操作数为二进制'operator%'

我只能从上述错误中得出的唯一结论是问题在于模运算符。

因此,我心中有以下疑问

  1. 包含模运算符的代码到底是什么问题?

  2. 我该如何解决?

我正在使用Code :: Blocks版本17.12,并将GNU GCC作为编译器。

2 个答案:

答案 0 :(得分:15)

您只能将%与整数一起使用,pow会产生浮点数。

您可以编写整数幂函数,或使用预定义的表,但颠倒构造顺序并从最右边的数字开始比较简单:

int main()
{
   int arrx[4];    //stores the individual digits of number as array
   int digx = 4;   //total number of digits in number
   long int dupx = 1234;  //number which has to be stored in array
   for(int i = 0; i < digx; i++)
   {
        arrx[digx-i-1] = dupx%10;
        dupx = dupx/10;
   }
    return 0;
}

答案 1 :(得分:13)

std::pow的各种形式都返回浮点类型,即使参数是整数类型也是如此。

由于%需要整数参数,因此编译将失败。

使用(long)(pow(10,i))是一种解决方法,当然要检查(long)是否足够长。请注意,即使在IEEE754下,pow也不要求返回可能的最佳浮点值,因此截断到long有时可能是有害的。也许首选std::round,然后再强制转换为long。尽管当前的方式是考虑将pow的任何实现都破坏为整数参数是有缺陷的实现。

在您的情况下,尽管我很想定义

constexpr/*use const on earlier standards*/ int powers[] = {1, 10, 100, 1000};

并适当索引。