什么是(ptr - A [0])/(sizeof(A [0])/ sizeof(A [0] [0]))的类型?

时间:2016-10-30 12:33:25

标签: c++ c arrays printf

我有一个2D数组A和一个指向其中某处的指针ptr。我知道如何计算行号,但表达式的实际类型似乎是不可移植的:

#include <stdio.h>

int main(void) {
    int A[100][100];
    int *ptr = &A[42][24];

    printf("row number is %d\n", (ptr - A[0]) / (sizeof(A[0]) / sizeof(A[0][0])));
    printf("col number is %d\n", (ptr - A[0]) % (sizeof(A[0]) / sizeof(A[0][0])));
    return 0;
}

在OS / X上,clang编译器以这种方式抱怨:

warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat]

在Linux上,gcc发出了类似的警告,但在Windows上,我得到了不同的诊断:

warning: format specifies type 'int' but the argument has type 'unsigned long long' [-Wformat]

此表达式的实际类型是什么?

有没有办法将表达式传递给printf而没有丑陋的演员?

1 个答案:

答案 0 :(得分:0)

很难说,我认为,并没有严格的规则来定义一种对所有平台都一致的类型。这样的表达式没有标准的库typedef。

如果您正在使用C ++,请考虑使用auto来声明这样的类型,并使用std :: cout来打印这种类型的值:依赖编译器为&lt;&lt;来选择适当的重载。