Если у меня есть переменная int и size_t, могу ли я сравнить их как:
int i=1;
size_t y=2;
if(i==y)
do something..
или мне нужно набрать одно из них?
Если у меня есть переменная int и size_t, могу ли я сравнить их как:
int i=1;
size_t y=2;
if(i==y)
do something..
или мне нужно набрать одно из них?
Это безопасно, если int
равен нулю или положителен. Если он отрицательный и size_t
имеет равный или более высокий ранг чем int
, то int
будет преобразован в size_t
, и поэтому его отрицательное значение вместо этого станет положительным. Это новое положительное значение затем сравнивается со значением size_t
, которое может (в ошеломляюще маловероятном совпадении) давать ложное положительное значение. Чтобы быть по-настоящему безопасным (и, возможно, чрезмерно осторожным), убедитесь, что int
неотрицателен первым:
/* given int i; size_t s; */
if (i>=0 && i == s)
и для подавления предупреждений компилятора:
if (i>=0 && (size_t)i == s)
size_t
будет неким типом целочисленного типа (хотя, возможно, без знака, поэтому он может генерировать предупреждение), поэтому для вас должно быть выполнено соответствующее кастинг.
Как уже говорили другие, вы можете захотеть пересмотреть все вычисления, создающие int
, и посмотреть, можете ли вы сделать это в size_t
, в первую очередь, если вы вычисляете требуемый размер для чего-то.
Можно сравнить значение size_t
со значением int
, значение int
будет неявно преобразовано в тип unsigned
.
Некоторые компиляторы выдают предупреждение при смешивании типов signed
и unsigned
при сравнении. В этом случае вы можете явно преобразовать значение signed
в соответствующий тип unsigned
для подавления предупреждения.