小生刚刚把 C 的指针学会,手里正好有一本 objective-C 的入门书,照着第二章的代码打了一下,发现 const 修饰的变量竟然可以修改且不报错,查找网上的资料后试着改了下代码,发现还是可以成功编译,请各位大大看一下这段代码,哪里出错了呢?//
//  main.m
//  2.1.4_const_modifier
//
//  Created by Cirno MainasuK on 2014-11-30.
//  Copyright (c) 2014年 Cirno MainasuK. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
    const NSString *foo = @"MY_CONSTANT";
    
    //  执行一些操作
    
    foo = @"SOME_OTHER_VALUE";  //  这会产生一个编译器错误
    
    if ([foo isEqualToString:@"MY_CONSTANT"]) {
        NSLog(@"%@", foo);
        //  执行操作
    }
    
     NSLog(@"%@", foo);
    return 0;
}
修改后的另一个版本//
//  main.m
//  2.1.4_const_modifier
//
//  Created by Cirno MainasuK on 2014-11-30.
//  Copyright (c) 2014年 Cirno MainasuK. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {
    NSString const *foo = @"MY_CONSTANT";
    
    //  执行一些操作
    
    foo = @"SOME_OTHER_VALUE";  //  这会产生一个编译器错误
    
    if ([foo isEqualToString:@"MY_CONSTANT"]) {
        NSLog(@"%@", foo);
        //  执行操作
    }
    
     NSLog(@"%@", foo);
    return 0;
}
附截图一张 TAT

解决方案 »

  1.   

    这代码不会有错误。
    首先,
    NSString const *foo = @"MY_CONSTANT";
    const  NSString *foo = @"MY_CONSTANT";
    本来就是等价的声明。要想有错误或者换一个版本,应该是
    NSString* const foo = @"myconstant";
      

  2.   

    NSString const *foo = @"MY_CONSTANT";
    指的是 *foo 是一个常量。
    NSString* const foo = @"";
    这样是指 foo 是一个常量。
      

  3.   


    这样改过的确是会报错,不过有趣的是:const NSString* foo = @"MY_CONSTANT";
    并不会出错呢,看来优先级很重要。(这个居然是这本书的印刷错误诶,不过按照上面的情况来看,const的位置就不对呢  
      

  4.   

    为什么 const int,int const 都可以修改呢?
      

  5.   

    const int *a; //指向常整型数的指针,指针所指向的地址中所存的内容不能改变
    int *const a; //指向整型数的常指针,指针所指向的地址不能改变
      

  6.   

    我感觉大家大家讨论的是c的字符串才对
    const char* s = xxx;
    char const * s = xxx;
    char* const s = xxx;
    中s指针本身能不能改,或者s指向的数据能不能改NSString只能要求指针本身能不能改,
    NSString的数据是不能改的吧?
    NSMutableString的数据才可以
      

  7.   


    const char* s = xxx;
    char const * s = xxx;
    char* const s = xxx;
    面试时,这道题答错的人,我不会怪他;
    答对的人,我才担心呢.
    会特别交待,不能使用这么生偏的技巧,特别是接口中出现const int init(const char const* const level) const;看到类似的接口,还得我拿起书本复习一下才能接着往下做事.对于数据,谁创建,谁释放,别人只能使用,不能修改....一旦跨过了这个规则,就需要在文档里面写明.....