objective-C 中为什么 const 变量的值可以被修改而不报错是

MainasuK 2014-11-30 07:50:29
小生刚刚把 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
...全文
365 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
szuzsq 2015-01-09
  • 打赏
  • 举报
回复

const char* s = xxx;
char const * s = xxx;
char* const s = xxx;
面试时,这道题答错的人,我不会怪他; 答对的人,我才担心呢. 会特别交待,不能使用这么生偏的技巧,特别是接口中出现

const int init(const char const* const level) const;
看到类似的接口,还得我拿起书本复习一下才能接着往下做事. 对于数据,谁创建,谁释放,别人只能使用,不能修改.... 一旦跨过了这个规则,就需要在文档里面写明.....
szuzsq 2015-01-09
  • 打赏
  • 举报
回复
我感觉大家大家讨论的是c的字符串才对

const char* s = xxx;
char const * s = xxx;
char* const s = xxx;
中s指针本身能不能改,或者s指向的数据能不能改 NSString只能要求指针本身能不能改, NSString的数据是不能改的吧? NSMutableString的数据才可以
Sun伯阳 2014-12-12
  • 打赏
  • 举报
回复
const int *a; //指向常整型数的指针,指针所指向的地址中所存的内容不能改变 int *const a; //指向整型数的常指针,指针所指向的地址不能改变
Sun伯阳 2014-12-12
  • 打赏
  • 举报
回复
具体的我也不记得了,*号的位置直接影响到定义的是静态的地址还是静态的变量,静态地址时地址是不可变的,但是值可以替换的
halifa1989 2014-12-12
  • 打赏
  • 举报
回复
为什么 const int,int const 都可以修改呢?
lx624909677 2014-12-03
  • 打赏
  • 举报
回复
好好理解下3#的意思,一个地址可改,一个是内容给可改,完全不一样,和优先级没关系
MainasuK 2014-12-01
  • 打赏
  • 举报
回复
引用 2 楼 ccnyou 的回复:
NSString const *foo = @"MY_CONSTANT"; 指的是 *foo 是一个常量。 NSString* const foo = @""; 这样是指 foo 是一个常量。
这样改过的确是会报错,不过有趣的是: const NSString* foo = @"MY_CONSTANT"; 并不会出错呢,看来优先级很重要。 (这个居然是这本书的印刷错误诶,不过按照上面的情况来看,const的位置就不对呢
Bannings 2014-12-01
  • 打赏
  • 举报
回复
同楼上,常量指针和指针常量的区别。 一个可以修改指针本身的值 一个可以修改指针指向的内存中的值
ccnyou 2014-11-30
  • 打赏
  • 举报
回复
NSString const *foo = @"MY_CONSTANT"; 指的是 *foo 是一个常量。 NSString* const foo = @""; 这样是指 foo 是一个常量。
ccnyou 2014-11-30
  • 打赏
  • 举报
回复
这代码不会有错误。 首先, NSString const *foo = @"MY_CONSTANT"; const NSString *foo = @"MY_CONSTANT"; 本来就是等价的声明。要想有错误或者换一个版本,应该是 NSString* const foo = @"myconstant";

29,049

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧