我是C编程新手。目前我正在尝试使用指针学习3d数组。下面是我试图调试的程序。任何人都可以解释下面给出的两个程序之间的区别吗?
代码1:
#include <stdio.h>
int main()
{
int a;
int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
printf("%d\n",*(*(*(d +1)+1)+1));
if(*(*(*(d +1)+1)+1) <(a= sizeof( int )))
puts(" u got it ");
else
puts (" but wrong");
return 0;
}
码2:
#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;
}
在第一段代码中,我得到了 [...不完整...]
答案 0 :(得分:4)
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
等。< / p>
printf("%d\n",*(*(*(d +1)+1)+1));
充满星星的东西是一种混淆的写作方式d[1][1][1]
。 X[Y]
的定义为*(X+Y)
。
(a= sizeof( int )))
赋值表达式的类型是左侧操作数的类型。所以第一个程序执行(int)-1 < (int)4
。第二个程序执行(int)-1 < (size_t)4
。 (假设你的整数是4字节大)。
在第一种情况下,这是true
。在第二种情况下,它是类型不匹配。在进行比较之前必须修复类型不匹配。 C的规则说在这种情况下,签名类型被转换为无符号类型,给出(size_t)-1 < (size_t)4
。由于(size_t)-1
实际上是最大可能size_t
值,因此此比较为false
。
答案 1 :(得分:1)
它基本上是整数类型比较问题。第一个程序将signed int
( - 1)与signed int
(a)进行比较,第二个程序将signed int
( - 1)与unsigned int
(sizeof())进行比较。在第二种情况下进行整数提升,其中signed int
( - 1)转换为unsigned int
( - 1) - &gt; SIZE_MAX。
有关类型比较的更多详细信息,请检查主题What are the general rules for comparing different data types in C?