我是C编程新手。目前我试图学习3d数组使用指针。下面是我正在调试的一个程序。有人能解释一下下面给出的两个程序的区别吗?
code1:
#include <stdio.h>
int main()
{
int a;
int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
printf("%dn",*(*(*(d +1)+1)+1));
if(*(*(*(d +1)+1)+1) <(a= sizeof( int )))
puts(" u got it ");
else
puts (" but wrong");
return 0;
}
code2:
#include <stdio.h>
int main()
{
int a;
int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
if(*(*(*(d +1)+1)+1) <(sizeof( int )))
puts(" u got it ");
else
puts (" but wrong");
return 0;
}
在第一个代码中,我得到[…不完整…]
int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
初始化项没有完全带括号,但在这种情况下,初始化项应用于内存中数组的下一个元素,因此这将分配d[0][0][0] = 1
, d[0][0][1] = -2
, d[0][1][0] = -3
等。
printf("%dn",*(*(*(d +1)+1)+1));
充满星星的东西是d[1][1][1]
的一种模糊的书写方式。X[Y]
的定义为*(X+Y)
。
(a= sizeof( int )))
赋值表达式的类型是左操作数的类型。第一个程序执行(int)-1 < (int)4
。第二个程序执行(int)-1 < (size_t)4
。(假设你的int值是4字节大)。
在第一种情况下,这是true
。在第二种情况下,它是类型不匹配。必须在进行比较之前修复类型不匹配。C规则规定,在这种情况下,有符号类型被转换为无符号类型,给出(size_t)-1 < (size_t)4
。因为(size_t)-1
实际上是size_t
可能的最大值,所以这个比较是false
。
这基本上是一个整数类型比较问题。第一个程序比较signed int
(-1)和signed int
(a),第二个程序比较signed int
(-1)和unsigned int
(sizeof())。整数提升发生在第二种情况下,其中signed int
(-1)被转换为unsigned int
(-1) -> SIZE_MAX。有关类型比较的更多细节,请查看线程,C中比较不同数据类型的一般规则是什么?