2011-11-02 40 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]<<" ";

相关问题