2017-05-10 21 views
1

關於代碼下面向下信息:該函數初始化玩家碼是:我不小心用條件語句(if)更改變量?

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; 

    } 
} 

過去之前的函數調用,所述第二對(對於(j = 0內;Ĵ<(mapa-> NUM_COLS + 1) ; j ++))我給一個角色「map-> p [i + 1] .m [j + 1] .player_id」。 然後我打印出來,此刻一切正常。但是,然後我使用了一個條件語句,它不應該以任何方式影響最後一個變量,我再次打印它,但是這次變量「map-> p [i + 1] .m [j + 1] .player_id」無理由更改爲'A'。如果給出的第一個字符是'A'但大部分時間不是這樣是可以理解的。爲什麼?

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

'='用於分配。使用'=='進行平等檢查 – kuro

+0

對不起,因爲被推遲了,我只是花了最後4個小時試圖找到一個solution.ty這麼多 –

回答

1

有兩個運營商在這裏打球,=(賦值運算符)和==(等於(條件)運算符)。賦值運算符(=)將右側的值賦值給左側的變量。賦值語句的結果值(例如a=b)爲b,即正在分配的值。

另一方面,條件運算符檢查兩邊的值是否相等。如果是,則表達式的結果值爲1,否則爲0


現在C任何非零值將被視爲true和零被視爲false。因此,表達式map->p[i+1].m[j+1].jugador_id = 'A'的值是A(ASCII 65)的值,其非零且因此爲真。這就是爲什麼if塊被執行。但同時要檢查條件本身必須執行的條件的「真實性」。條件執行時,和該變量的值被設定爲A

3

map->p[i+1].m[j+1].jugador_id = 'A'是類型的表達int 等於任何'A'等於。

在一切可能的編碼'A'是非零的,所以你的if塊將始終運行。

解決方法:用==代替=

某些民間人寫'A' == map->p[i+1].m[j+1].jugador_id,如果他們滑倒==引起編譯時失敗。


我沒有錯。 'A'是C中的int字面值,以及C++中的char字面值。

C標準堅持認爲'A'不能爲0

+0

同意在'=='左側使用常量'A' – kuro

1
map->p[i+1].m[j+1].jugador_id = 'A' 

總是要在如果條件爲真,因爲賦值運算符= 被用來代替等價運算符==。這意味着每次達到這個if語句時,不是將變量與'A'進行比較,而是將該值設置爲'A'。由於'A'的ASCII值不爲零,所以if語句總是計算爲真。

簡單的解決方法是將語句更改爲具有等同運算符==,以便將值與'A'進行比較,然後在if塊爲true時運行if塊。