首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果(self = [super ])与if (self= [super ])

如果(self = [super ])与if (self= [super ])
EN

Stack Overflow用户
提问于 2010-06-17 05:57:32
回答 3查看 6.8K关注 0票数 21

当时只是在做代码评审,然后开始怀疑:

我认为if (self = [super init])检查将[super init]的返回值分配给变量self是否成功(操作值)。因此,(self = nil)实际上是TRUE

我认为if ((self = [super init]))检查赋值后self的值(变量的值)。因此,((self = nil))将是FALSE

在初始化您自己的类时,哪一种方法是正确的?苹果文档使用的是前一种(举个例子),我现在实际上正在使用这种风格。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-17 06:00:57

他们都做同样的事。if计算的内容是它内部表达式的值,它是赋值中的赋值。因此,当self不是零时,就进入if块。

第二种形式在它周围抛出部分,以压制任何关于条件内赋值的潜在编译器警告,这通常是错误的做法,可能是错误的。但这是惯用的目标-C,所以用第一种方法做是可以的。

票数 21
EN

Stack Overflow用户

发布于 2010-06-17 07:51:56

正如其他人所说,在这种情况下,括号并不重要。它们真正重要的地方是,如果您明确地检查为零:

代码语言:javascript
复制
if (self = [super init] != nil) // wrong!

if ((self = [super init]) != nil) // right

!=具有比=更高的优先级,因此在第一种情况下,您将[super init] != nil的布尔值(可能为真)分配给self,然后对if进行测试。

就我个人而言,我不关心这两种情况,但我更喜欢在测试之外显式地完成任务。这反映了我的编程背景,使我相信布尔值与整数和指针是不同的类型,而赋值不是表达式,即使在C实现中,我错了。

代码语言:javascript
复制
self = [super init];
if (self != nil) 
票数 13
EN

Stack Overflow用户

发布于 2010-06-17 06:00:46

“赋值表达式具有赋值后左操作数的值”(C99),因此,正如您所说,无论哪种方式,它都有变量的值。额外的括号没有什么区别(除了警告之外)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3059232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档