【问题标题】:Decimal itself converts to hexadecimal十进制本身转换为十六进制
【发布时间】:2011-11-02 13:08:21
【问题描述】:

我有一个小问题。我创建 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

【问题讨论】:

标签: c++


【解决方案1】:

那是因为你落入了运营商,的狡猾陷阱!

首先,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 &lt; k; i++, j += 2) 或类似的。

【讨论】:

    【解决方案2】:
    cout << ar[i,j] << " ";
    

    这应该是

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

    逗号运算符, 确实(来自here

    逗号运算符 (,) 用于分隔两个或多个表达式,这些表达式包含在只需要一个表达式的情况下。当必须对一组表达式求值时,只考虑最右边的表达式。

    所以这是打印出ar[j](在评估i 并丢弃结果之后),它是一个指针,因此是十六进制的。

    【讨论】:

      【解决方案3】:

      访问数组成员的 C++ 语法是:

      ar[i][j]
      

      您来自帕斯卡背景? :P

      【讨论】:

        【解决方案4】:

        你想做的事

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

        http://ideone.com/G5n4Z with GNU 表示其未定义的行为。

        【讨论】:

          【解决方案5】:

          cout&lt;&lt;ar[i,j]&lt;&lt;" ";

          将此行更改为:

          cout&lt;&lt;ar[i][j]&lt;&lt;" ";

          【讨论】: