2015-08-08 50 views
0

我得到在我的代碼符號和無符號整數表達式之間的比較:警告:有符號和無符號整數表達式之間的比較..如何解決它?

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<row.size();i++)

我怎樣才能解決這個警告呢?

+1

萬一有*不*感覺就像計數。 'pro = pro * pow(row [i],m);'是第27行。請用表示行號的註釋標記有問題的行,例如'// 27行HERE'。謝謝。 – WhozCraig

+4

我敢打賭,在**真正的代碼**,對於(長我= 0;我

+0

@DrewDormann我會支持你的賭注,不是你需要它。 – WhozCraig

回答

3

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

您的循環計數變量的類型爲long這是簽署的類型。因此,在循環條件下,您正在比較已簽名和未簽名類型。

解決方案很簡單:使用std::vector<long int>::size_type(或者甚至可以是size_t)而不是long

+1

或'decltype(row):: size_type'上有大量重複項,因此如果「行」的元素類型發生更改,則不必更改它。 – emlai

2

vector::size返回一個size_type這是一個無符號整數值。

您可以修復的兩種方式這一個:

  1. 在使用一個無符號的迭代您for -loop:for(auto i = 0U; i < row.size(); ++i)
  2. 科協vector::size返回一個符號整數:for(auto i = 0; i < static_cast<int>(row.size()); ++i)
0

C++有一個叫做range-based for loop的東西,它可以免除處理索引變量的負擔。它還解決了您的不匹配簽名問題:

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

只要使用它。

相關問題