Domanda

Supponiamo che io ho questo (C ++ o forse C) codice:

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

Non mi importa se è fatto bene. La parte importante è nella dichiarazione per l'anello. Il compilatore fornisce una firma non corrispondente / unsigned per questo, dal momento che size () restituisce un int non firmato, non firmato uno. Quanto è importante per cambiare i a non firmato? Dichiaro contatori di ciclo come interi per abitudine, ma se questo è un potenziale errore mi costringo a uscire l'abitudine.

È stato utile?

Soluzione

Direi che è molto importante - si dovrebbe essere la compilazione con gli avvisi come errori, e si sforzano di correggere tutte le avvertenze. Se si lascia problemi di questo tipo nel codice, è facile entrare in un'abitudine di ignorare gli avvertimenti, o lasciando falsi positivi come questo soffocare gli avvisi che indicano problemi reali.

In questo caso, per questo errore specifico, probabilmente non è un grosso problema - su una piattaforma a 32 bit che avrei dovuto avere più di 2 miliardi di voci nel vettore prima della unsigned sarebbe avvolgere in un valore negativo con segno. Per ottenere un vettore come questo sarebbe esaurire tutta la memoria, quindi probabilmente non è possibile entrare in uno stato in cui firmato / unsigned mancata corrispondenza avrebbe avuto importanza.

Altri suggerimenti

Tecnicamente, i dovrebbe essere un vector<int>::size_type. Si dovrebbe prendere l'abitudine di usare typedef s nel codice:

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

Ora, se cambiamo ad un deque, cambiamo una sola linea. Anche se è un po 'contenitore personalizzato che ha un size_type stravagante, si ottiene la sensazione calda e confusa che tutto sarà ok. E che vale la pena un sacco. Anche con solo unsigned / firmato, ci sono alcuni problemi di promozione difficili con l'utilizzo firmato / unsigned conversione che inevitabilmente tornare a mordere voi.

Questo può essere importante nel caso improbabile che la dimensione del vettore supera INT_MAX. Se la dimensione del vettore è maggiore del valore massimo che può essere rappresentato in un firmato int, allora il ciclo non terminerà mai.

Bene, le sue importanti perché interi con segno hanno segno, così ho potuto andare fino in fondo per diventare un valore negativo, quindi non importa quanto grande sia, sarebbe comunque inferiore a size (), che pretende molto avere alcun segno.

  

11111111 <10000000

Nella maggior parte dei casi di tuo esempio, non importa. ma quando il programma non funziona, la prima cosa che si fa (o dovrebbe) è quello di assicurarsi che non vi siano avvertimenti, quindi è una possibilità non vale la pena prendere.

assicurarsi che non vi siano meno avvertimenti possibili.

Come detto sopra, utilizzare vector :: size_type; o utilizzare un iteratore per scorrere il vostro vettore. Assicurati di gestire tutti i tuoi avvisi come errori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top