在Objective-C中,常量是神奇地改变了吗?

时间:2011-06-24 20:21:45

标签: objective-c constants c-preprocessor

在我的程序中,我在顶部有#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 lol 1.500000 2.250000 lol 2.250000)

为什么会这样?

2 个答案:

答案 0 :(得分:9)

使用#define MAXIMUM_SCALE 10时,您定义的是整数常量,而不是浮点数。我猜你的代码是为x86-64编译的。在该体系结构中,浮点和整数变量通过不同类型的寄存器传递。由于对NSLog的第二次调用不使用任何浮点参数,因此前一次调用的值仍将位于用于检索值的寄存器中,这意味着您将从上一次调用中获取值时间。您应该在第二个NSLog上收到编译器警告,告诉您参数与传递的格式不匹配。您可以通过告诉编译器MAXIMUM_SCALE应该是浮点数来解决这个问题。

#define MAXIMUM_SCALE 10.0f

小数告诉编译器你想要一个浮点数而不是一个整数,而f告诉编译器使用float类型而不是double

答案 1 :(得分:1)

更改

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

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