有关下面代码的信息:函数初始化玩家代码是:
void initialise_players (tvector_players *vj){
int i;
for (i=0; i< (vj->nplayers); i++){
vj->vjug [i].letter = 'A'+i;
vj->vjug [i].num_regiones = 0;
}
}
超过上一个函数调用,在第二个函数内(for(j = 0; j&lt;(mapa-&gt; num_cols + 1); j ++))我给了一个字符&#34; map-&gt; p [I + 1]的m [J + 1] .player_id&#34 ;. 然后我打印出来,此刻一切都还好。但后来我使用了一个条件句子,它不应该以任何方式影响最后一个变量,我再次打印它,但这次是变量的值&#34; map-&gt; p [i + 1] .m [j + 1 ] .player_id&#34;更改为&#39; A&#39;没原因。如果给出的第一个字符是&#39; A&#39;那将是可以理解的。但大部分时间都没有。为什么呢?
initialise_players (vj);
for (i=0; i < (map->rows+1); i++){
for (j=0; j < (mapa->num_cols+1); j++){
map->p[i+1].m[j+1].player_id = 'A'+rand()%vj->nplayers;
printf ("\n%c\n", map->p[i+1].m[j+1].jugador_id);
if (map->p[i+1].m[j+1].jugador_id = 'A'){
printf ("\n%c\n", map->p[i+1].m[j+1].jugador_id);
vj->vjug[0].num_regiones += 1;
}
}
}
show_matrix (map, vj);
答案 0 :(得分:3)
map->p[i+1].m[j+1].jugador_id = 'A'
是类型int
1 的表达式,等于'A'
等于的任何内容。
在每个可能的编码 2 上,'A'
不为零,因此您的if
块将始终运行。
解决方案:将=
替换为==
。
有些人写'A' == map->p[i+1].m[j+1].jugador_id
会导致编译时失败==
。
1 我没错。 'A'
是C中的int
字面值,C ++中的char
字面值。
2 C标准坚持认为'A'
不能为0。
答案 1 :(得分:1)
这里有两个运算符,=
(赋值运算符)和==
(等于(条件)运算符)。赋值运算符(=
)“将权限右侧的值赋给左侧的变量。赋值语句(例如a=b
)的结果值为b
,即分配的值。
另一方面,条件运算符检查两侧的值是否相等。如果是,则表达式的结果值为1
,否则为0
。
现在在C
中,任何非零值都被视为true
,零被视为false
。因此,表达式map->p[i+1].m[j+1].jugador_id = 'A'
的值是A
(在ASCII 65中)的值,它不为零,因此为真。这就是执行if块的原因。但同时要检查条件本身必须执行的条件的“真实性”。条件执行,变量值设置为A
答案 2 :(得分:1)
map->p[i+1].m[j+1].jugador_id = 'A'
在if条件中始终为真,因为赋值运算符= 用来代替等价运算符==。这意味着每次达到这个if语句时,不是将变量与'A'进行比较,而是实际做的是将值设置为'A'。由于'A'的ASCII值不为零,因此if语句将始终求值为true。
简单的解决方法是将语句更改为等效运算符==,以便将值与“A”进行比较,然后运行if块(如果为真)。