2011-11-02 81 views
1

我有一個小問題。我創建了2D int數組。當我知道它時,我會得到十進制的十六進制數字。我正在使用Dev C++。十進制本身轉換爲十六進制

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    const int max=9; 
    int ar[max][max]={ 
     {0,6,0,0,2,0,0,4,0}, 
     {5,0,0,3,0,0,0,0,0}, 
     {0,8,0,0,1,0,0,0,0}, 
     {6,0,0,0,0,7,0,0,0}, 
     {0,3,7,0,0,0,2,8,0}, 
     {0,2,0,8,0,0,0,3,0}, 
     {0,0,0,0,0,0,0,0,0}, 
     {7,0,0,4,0,0,0,0,1}, 
     {0,0,0,0,6,0,0,2,0}}; 

    for (int i=0;i<max;i++){ 
     for(int j=0;j<max;j++){ 
      cout<<ar[i,j]<<" "; 
     } 
     cout<<"\n"; 
    } 

    system("pause"); 
    return 0; 
} 

作爲回報,我得到這個http://www.dropmocks.com/mf8wl

+0

我很驚訝這個編譯。 – anio

+0

@anio - 我得到一個警告http:// ideone。com/G5n4Z –

+1

不要使用Dev C++:http://stackoverflow.com/tags/dev-c%2b%2b/info –

回答

9

那是因爲你已經陷入運營商,的狡猾的陷阱!

首先,C沒有多維數組作爲原語。正如你在這裏聲明的那樣,二維數組就是「一組數組」。因此,使用a[i,j]訪問數組是沒有意義的。你應該先用a[i]得到「行」,然後用[j]索引「列」,從而得到a[i][j]

那麼,爲什麼你的代碼編譯?因爲,是C中的一個操作符。a,b的評估實際上是表達式a的評估,然後是b,返回評估b的結果。因此,您實際上在此處打印a[j],這是一個int[],以十六進制數字打印爲陣列的地址。

爲什麼你要問運營商,?除了令人困惑之外,它主要用於像for這樣的構造,您可能希望在初始化或增量構造中使用多個表達式,即for (j = 0, i = 0; i + j < k; i++, j += 2)或類似構造。

2

C++的語法來訪問數組成員是:

ar[i][j] 

您從一個Pascal背景的? :P

4
cout << ar[i,j] << " "; 

這應該閱讀

cout << ar[i][j] << " "; 

逗號操作符,確實(從here

逗號(,)分開用於分離兩個或更多個表達式是包括預期只有一個表達式的地方。當必須對一組值進行評估時,只考慮最右邊的表達式。

因此,這是打印出ar[j]是一個指針,並因此十六進制(評價i並丟棄結果之後)。

+0

+1很好的解釋。 –

0

cout<<ar[i,j]<<" ";

改變這一行到:

cout<<ar[i][j]<<" ";