¿Puedo comparar un int
y un size_t
variables como esta:
int i = 1;
size_t y = 2;
if (i == y) {
// Do something
}
¿O tengo que escribir uno de ellos?
Es seguro siempre que el int
es cero o positivo. Si es negativo y size_t
es de igual o mayor rango que int
entonces el int
se convertirá en size_t
y así su valor negativo se convertirá en cambio en un valor positivo. Este nuevo valor positivo se compara luego con el size_t
valor, que puede (en una coincidencia asombrosamente improbable) dar un falso positivo. Para estar realmente seguro (y tal vez demasiado cauteloso), verifique que el int
es no negativo primero:
/* given int i; size_t s; */
if (i>=0 && i == s)
y para suprimir las advertencias del compilador:
if (i>=0 && (size_t)i == s)
heliarc
Si va a comparar un tipo int con size_t
(o cualquier otro tipo de biblioteca), está haciendo una comparación arriesgada porque int
está firmado y size_t
no está firmado, por lo que uno de ellos se convertirá implícitamente según su compilador/plataforma. Lo mejor que puedes hacer es reescribir tu int i
como:
decltype(y.size()) i = 1;
Esto asigna su i
como el tipo seguro que está tratando de comparar, y creo que es una buena práctica. Esta solución también es útil en todo tipo de iteradores. Por lo general, no desea confiar en el compilador para que emita por usted, puede hacerlo, pero es arriesgado e innecesario.
pablo tomblin
size_t
será una especie de tipo entero (aunque posiblemente sin firmar, por lo que podría generar una advertencia), por lo que la conversión adecuada se debe realizar automáticamente.
Como ya han dicho otros, es posible que desee revisar cualquier cálculo que esté produciendo el int
y mira si puedes hacerlo en size_t
en primer lugar, si está calculando un tamaño requerido para algo.
-
size_t
debe estar sin firmar.– Felipe Potter
4 de septiembre de 2010 a las 11:32
-
En realidad, los tipos sin firmar crean más problemas de los que resuelven (cuando se usan para tamaños). Un mejor consejo sería huir de unsigned como cantidad tan pronto como sea posible (casting to
int
). Puedes tener problemas alrededorINT_MAX
valores, pero con unsigned puede tener problemas alrededor de cero y eso es mucho más común en la programación.– 6502
29 de agosto de 2017 a las 6:34
Está bien comparar un size_t
valor con un int
valor, el int
valor se convertirá implícitamente a unsigned
tipo.
Algunos compiladores emitirán una advertencia cuando mezcle signed
y unsigned
tipos en las comparaciones. En ese caso, puede convertir explícitamente el signed
valor a un valor apropiado unsigned
escriba para suprimir la advertencia.
¿Realmente necesitas comparar un
int
a unsize_t
? Por lo general, no debería hacerlo y es posible que esté convirtiendo incorrectamente unint
asize_t
o viceversa en algún lugar.– GameZelda
4 de septiembre de 2010 a las 11:19
solo por el bien del conocimiento 🙂
– usuario379888
4 de septiembre de 2010 a las 13:25
El caso “obvio” para comparar un int y un size_t es
snprintf()
.– John Hascall
6 de julio de 2018 a las 13:52
Es posible que desee verificar los límites de un índice vectorial int, o int sin signo.
– Quentin Reino Unido
28 de septiembre de 2019 a las 11:10