我想检查tab[i][j + 1]
是否存在,它是int **tab;
if (tab[i][j + 1] && tab[i][j + 1] == a_value)
tab[i][j + 1] = 1;
printf("%d\n", tab[i][j + 1]);
并打印我a_value
,但如果我取消tab[i][j + 1]
if (/*tab[i][j + 1] && */tab[i][j + 1] == a_value)
tab[i][j + 1] = 1;
printf("%d\n", tab[i][j + 1]);
它打印我1
。
为什么我无法检查tab[i][j + 1]
是否存在?
这里是我将地图放在数组中的地方
while (tmp != 22)
{
ln = read(fd, buff, 22);
buff[ln] = '\0';
while (buff[k] != '\0')
{
if (buff[k] == 'x')
tab[i][j] = WALL;
else if (buff[k] == ' ')
tab[i][j] = 0;
else if (buff[k] == 'e')
tab[i][j] = ENTRE;
else if (buff[k] == 's')
tab[i][j] = SORTIE;
k++;
j++;
}
k = 0;
tab[i][j] = -5;
j = 0;
i++;
tab[i] = malloc(sizeof(*tab) * 2000);
tmp++;
}
这是地图
xxxxxxxxxxxxxxxxxxxxx
xxx s
xxx xxxxxxxxxxxxxxxxx
xxx xxxxxxxxxxxxxxxxx
xxx xxxxx xxxxxxxxxxx
xxx xxxxx xxxxxxxxxxx
xxx xxxxx x
xx xxxxx x xxxxx x
xx xxxxxx xxx xxxxx x
xx xxx xxxxx x
xxxxxxxxx xxx xxxxx x
xxxxxx xxxxx x
xxxxxxxxx xxx xxx x
xxx xxxx xxx x
xxxxx xxx xxxxx xxx x
xxxxx xxx xxxx xxx x
xxx xxxx xxxx xx x
xxxx xxxxx xxxxx xx x
xxxx xxx xxxxx xx x
xxxx xxx xxx
xxxxxxxxexxxxxxxxxxxx
答案 0 :(得分:3)
表达式tab[i][j + 1] && tab[i][j + 1] == 0
相当于tab[i][j + 1]!=0 && tab[i][j + 1] == 0
这是不可能的,因此解析为false(0)。
为什么它等同于此?因为语句if(someStmt)
等同于if(someStmt!=0)
,因为在C中,任何不同于零的数字都被假定为true
而零为false
。
答案 1 :(得分:3)
(因为有很多答案解释了你if
中的矛盾,我会跳过它。)
你无法检查tab[i][j + 1]
是否存在,因为C没有维护有关(malloc
ed)指针大小的信息(好吧,除了指针大小,我说的是该指针后面的缓冲区大小)。如果tab
是正确的数组,您可以使用sizeof
检查索引是否小于该值。但是,当您将tab
声明为int **
时,此信息将丢失。
简而言之:您需要在某处记录tab
的尺寸或将其声明为数组,例如:
int tab[4][5];
然后你可以使用类似的东西来检查数组中的某个索引是否在边界内:
#define isAllocated(array, index) (index < sizeof(array))
并使用它:
if(isAllocated(tab[i], j+1) && tab[i][j + 1] == 0){ ...
答案 2 :(得分:2)
这是因为条件tab[i][j + 1] && tab[i][j + 1] == 0
始终为false
。在tab[i][j + 1]
时,将包含非零值或零值。
答案 3 :(得分:1)
考虑tab[i][j+1]
是0
if (tab[i][j + 1] && tab[i][j + 1] == 0) will result in if(0 && 1)/if(false && true) == if (0)/if(false)
因此,赋值语句tab[i][j + 1] = 1;
没有执行,tab[i][j+1]
值打印= 0
(我假设)
if (/*tab[i][j + 1] && */tab[i][j + 1] == 0) will result in if(1)/if(true)
所以赋值语句tab[i][j + 1] = 1;
执行并输出1
。