2013-06-11 15 views
6

Ho un problema che non riesco a capireespressione in comando FOR (for (int i = 0; i <([arr count] -1); i ++) {})

NSArray *emptyArr = @[]; 
for (int i=0; i < ([emptyArr count]-1) ; i++) { 
    NSLog(@"Did run for1"); 
} 

[emptyArr count] - 1 è -1 ma la mia app funziona ancora con il comando NSLog!

Se io uso una variabile int:

NSArray *emptyArr = @[]; 
int count = [emptyArr count]-1; 
for (int i=0; i < count ; i++) { 
    NSLog(@"Did run for1"); 
} 

poi la mia applicazione non viene eseguito NSLog comando.

Chiunque mi aiuti per favore!

+1

Nella tua prima versione, quante linee di output ottieni? Solo uno? –

+0

Grazie @ Frank Schmitt. Penso di aver trovato il motivo! – VietHung

risposta

6

Questo perché il tipo di reso di count è un senza firmaint. Quando sottrai 1 da 0, non ottieni -1. Al contrario, il underflow è il più alto possibile su unsigned int. Il motivo per cui funziona nella seconda versione è perché l'hai trasmesso (implicitamente) a uno int in cui il valore -1 è legale.

+0

Grazie! Anch'io ho riconosciuto! : (( – VietHung

+0

@borrrden +1 per la spiegazione di Nizza. – iLearner

0

[emptyArr count]-1 non è mai inferiore a 0 poiché non è firmato. Sto indovinando se si fa ((int)[emptyArr count]-1), si otterrà il comportamento corretto.

0

Il valore restituito da [emptyArr count] è un numero intero senza segno. Nel primo caso, [count EmptyArr] -1 è rappresentato da 0-1 nel complimento di 2, che è un numero enorme. Quindi stampa il registro molte volte.

Nel secondo caso, [emptyArr count] -1 -> Si sta trasmettendo il risultato di questo a int. 0-1 -> -1 firmato int. Quindi non stampa.

Problemi correlati