我不小心用条件句(if)更改变量?

时间:2017-05-10 15:16:05

标签: c function matrix functional-programming

有关下面代码的信息:函数初始化玩家代码是:

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);

3 个答案:

答案 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块(如果为真)。