Pregunta

Supongamos que tengo esto (C ++ o tal vez C) código:

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

No me importa si se hace bien. La parte importante es en la declaración de bucle. El compilador da un desajuste firmado / sin firmar para esto, ya que el tamaño () devuelve un entero sin signo, no firmado, uno. ¿Cuán importante es para cambiar a i sin firmar? Declaro como contadores de bucles enteros por falta de costumbre, pero si esto es un error potencial Voy a obligo a salir del hábito.

¿Fue útil?

Solución

Yo diría que es muy importante - que debe compilar con advertencias como errores, y tratar de solucionar todas las advertencias. Si deja este tipo de problemas en su código, es fácil de conseguir en el hábito de ignorar las advertencias, o dejar que los falsos positivos como éste ahogar las advertencias que indican problemas reales.

En este caso, para este error específico, probablemente no es un gran problema - en una plataforma de 32 bits que tendría que tener más de 2 mil millones de entradas en el vector antes de la sin firmar se envolvía en un valor negativo firmado. Para obtener un vector como esto agotaría toda la memoria, por lo que probablemente no es posible entrar en un estado donde firmado desajuste / sin signo importaría.

Otros consejos

Técnicamente, i debe ser un vector<int>::size_type. Usted debe adquirir el hábito de usar typedef s en el código:

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

Ahora, si cambiamos a un deque, sólo cambiamos una sola línea. Incluso si se trata de algún contenedor personalizado que tiene un size_type loco, se tiene la sensación cálida y difusa que todo va a estar bien. Y eso vale mucho. Incluso con sólo sin / con signo, hay algunas cuestiones difíciles de promoción con el uso / conversión sin firmar que inevitablemente va a volver a morder firmado.

Esto puede ser importante en el caso improbable de que el tamaño del vector excede INT_MAX. Si el tamaño del vector es mayor que el valor máximo que se puede representar en un int firmado, entonces el bucle nunca terminará.

Bueno, sus importantes porque enteros con signo tienen signo, para que pudiera ir todo el camino hasta convertirse en un valor negativo, entonces no importa lo grande que es, todavía sería menor que el tamaño (), que duerma tener ninguna muestra.

  

11111111 <10000000

En la mayoría de los casos de su ejemplo, ya no importará. pero cuando el programa no funciona, lo primero que hacen (o deberían) es asegurarse de que no hay advertencias, así que es una oportunidad que no vale la pena.

asegurarse de que haya el menor número posible de advertencias.

Como se dijo anteriormente, el uso vector :: size_type; o utilizar un iterador para recorrer su vector. Asegúrese de manejar todas sus propias advertencias como errores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top