【问题标题】:Constant is magically changing in Objective-C?常量在Objective-C中神奇地改变了?
【发布时间】:2011-09-22 08:01:18
【问题描述】:

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

为什么会这样?

【问题讨论】:

    标签: objective-c constants c-preprocessor


    【解决方案1】:

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

    #define MAXIMUM_SCALE 10.0f
    

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

    【讨论】:

      【解决方案2】:

      改变

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

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

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 2023-04-03
        • 2010-11-19
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        相关资源
        最近更新 更多