小生刚刚把 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
// 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
首先,
NSString const *foo = @"MY_CONSTANT";
const NSString *foo = @"MY_CONSTANT";
本来就是等价的声明。要想有错误或者换一个版本,应该是
NSString* const foo = @"myconstant";
指的是 *foo 是一个常量。
NSString* const foo = @"";
这样是指 foo 是一个常量。
这样改过的确是会报错,不过有趣的是:const NSString* foo = @"MY_CONSTANT";
并不会出错呢,看来优先级很重要。(这个居然是这本书的印刷错误诶,不过按照上面的情况来看,const的位置就不对呢
int *const a; //指向整型数的常指针,指针所指向的地址不能改变
const char* s = xxx;
char const * s = xxx;
char* const s = xxx;
中s指针本身能不能改,或者s指向的数据能不能改NSString只能要求指针本身能不能改,
NSString的数据是不能改的吧?
NSMutableString的数据才可以
const char* s = xxx;
char const * s = xxx;
char* const s = xxx;
面试时,这道题答错的人,我不会怪他;
答对的人,我才担心呢.
会特别交待,不能使用这么生偏的技巧,特别是接口中出现const int init(const char const* const level) const;看到类似的接口,还得我拿起书本复习一下才能接着往下做事.对于数据,谁创建,谁释放,别人只能使用,不能修改....一旦跨过了这个规则,就需要在文档里面写明.....