【问题标题】:warning: comparison between signed and unsigned integer expressions..how to solve it?警告:有符号和无符号整数表达式之间的比较..如何解决?
【发布时间】:2015-08-08 04:19:47
【问题描述】:

我在我的代码中比较有符号和无符号整数表达式:

    vector<long int> row;
    long n,m;
    long int pro=1;
    cin>>n;
    for(long i=0;i<n;i++)
    {
        long int temp;
        for(long j=0;j<n;j++)
        {
            cin >> temp;
            row.push_back(temp);
        }
    }

    cin >> m;
    for(long i=0;i<row.size();i++)
        pro = pro * pow(row[i],m);

    long int mod = 1000000007;
    cout<< (long int)pro%mod;

在线:for(long i=0;i&lt;row.size();i++)

如何解决此警告?

【问题讨论】:

  • 万一有人不想数数。 pro = pro * pow(row[i],m); 是第 27 行。请用 cmets 表示行号,例如 // line 27 HERE 标记有问题的行。谢谢。
  • 我敢打赌,在真正的代码中,for(long i=0;i&lt;row.size();i++) 是第 27 行。
  • @DrewDormann 我会支持你的赌注,而不是你需要它。
  • 你为什么同时使用 both long 和 long int?它们是同一类型。

标签: c++ integer size unsigned signed


【解决方案1】:

std::vector::size 返回值size_type,即Unsigned integral type (usually std::size_t)。

您的循环计数变量是long 类型,它是一个有符号 类型。因此,在循环条件中,您正在比较有符号和无符号类型。

解决方案很简单:使用std::vector&lt;long int&gt;::size_type(甚至可能是size_t)而不是long。

【讨论】:

  • 或者decltype(row)::size_type,所以如果row的元素类型发生了变化,你就不必改变它。
【解决方案2】:

vector::size 返回一个size_type,它是一个无符号整数值。

您可以通过以下两种方式之一解决此问题:

  1. 在for-loop 中使用无符号迭代器:for(auto i = 0U; i &lt; row.size(); ++i)
  2. 将vector::size 的返回值转换为有符号整数:for(auto i = 0; i &lt; static_cast&lt;int&gt;(row.size()); ++i)

【讨论】:

    【解决方案3】:

    C++ 有一个叫做range-based for loop 的东西,它可以让你从处理索引变量的负担中解脱出来。它还解决了您不匹配的签名问题:

    for(long r : row)
        pro = pro * pow(r,m);
    

    随便用吧。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      相关资源
      最近更新 更多