Константа магически меняется в Objective-C? - PullRequest
3 голосов
/ 25 июня 2011

В моей программе #define MAXIMUM_SCALE 10 вверху

Единственный раз, когда эта константа используется когда-либо, находится в этом разделе кода:

float newScale = [scrollView zoomScale] * ZOOM_STEP;
NSLog(@"%f", newScale);
NSLog(@"lol %f", MAXIMUM_SCALE);

if( [scrollView zoomScale] < MAXIMUM_SCALE){
    [self handleZoomWith:newScale andZoomType: TRUE];
}

Каким-то образом NSLog-ы печатают, что MAXIMUM_SCALE - это то же самое, что newScale

т.е. (1.500000 лол 1.500000 2.250000 лол 2.250000)

Почему это происходит?

Ответы [ 2 ]

9 голосов
/ 25 июня 2011

Когда вы используете #define MAXIMUM_SCALE 10, вы определяете целочисленную константу, а не число с плавающей точкой.Я предполагаю, что ваш код компилируется для x86-64.В этой архитектуре переменные с плавающей запятой и целочисленные переменные передаются через регистры разных типов.Поскольку при втором вызове NSLog не используются никакие аргументы с плавающей запятой, значение из предыдущего вызова все еще будет в регистре, который используется для получения значения, что означает, что вы каждый раз получаете значение из предыдущего вызова.Вы должны получить предупреждение компилятора на втором NSLog о том, что аргументы не соответствуют переданному формату.Вы можете исправить это, сказав компилятору, что MAXIMUM_SCALE должно быть с плавающей запятой.

#define MAXIMUM_SCALE 10.0f

Десятичное число говорит компилятору, что вы хотите число с плавающей запятой вместо целого числа, а f сообщаеткомпилятор для использования типа float вместо double.

1 голос
/ 25 июня 2011

Изменение

 NSLog(@"lol %f", MAXIMUM_SCALE);

до

 NSLog(@"lol %d", MAXIMUM_SCALE);
...