Чисто/безопасно ли вводить приведение только со спецификатором формата и оператором присваивания в Objective-C?

В Objective-C это чистый/безопасный подход к приведению типа, скажем, числа с плавающей запятой к целому числу с простым присвоением переменной с плавающей запятой переменной int и спецификатором формата %i в вызове NSLog?

Правильный способ сделать это — объявить приведенный тип следующим образом:

int x; 
float y;

y = 7.43;

x = (int) y; //type cast (int)

NSLog(@"The value of x is %i", x);

Выход:

Значение х равно 7

Этот метод приведения типов был бы идеальным подходом, но я попытался просто присвоить переменную с плавающей запятой переменной int, и он работает так же, есть ли разница?

Это другой метод без (типа):

int x;
float y;

y = 7.43;

x = y; // no (int) casting for variable 'y' here

NSLog(@"The value of x is %i", x);

Выход:

Значение х равно 7

Как видите, результат тот же, в чем разница? оба метода хороши? что чище?


person bntzio    schedule 03.11.2013    source источник
comment
Вышеупомянутое не имеет ничего общего со спецификаторами формата, так как любое преобразование происходит до того, как вы доберетесь до инструкции NSLog. Чего вы не хотите делать, так это NSLog(@"The value of x is %i", y); ожидать, что произойдет неявное преобразование из числа с плавающей запятой в целое -- этого не произойдет, и результат будет тарабарщиной (если вы на самом деле не вызовете сбой). Однако было бы законно сделать NSLog(@"The value of x is %i", (int) y);.   -  person Hot Licks    schedule 03.11.2013


Ответы (1)


Вам не нужно явное приведение типов, но оно не помешает и сделает ваш код более читабельным.

Я считаю, что это безопасно, главным образом потому, что максимальное число с плавающей запятой намного меньше, чем возможное целое число, поэтому потери данных быть не должно.

Убедитесь, что вы намерены усекать десятичную часть вашего значения с плавающей запятой, а не округлять.

person Mundi    schedule 03.11.2013
comment
Да, при переходе от float к int всегда следует использовать явное приведение для документации. В противном случае операция будет выглядеть ужасно похожей на ошибку для кого-то, просматривающего ее. - person Hot Licks; 03.11.2013