作者在他的解释中犯了一个逻辑错误吗?

时间:2012-10-15 03:35:40

标签: objective-c

我正在从“Objective-c编程”作者Kochan学习Objective-c。第3版。 在第8章“继承”中,Kochan先生对该方法作了如下解释:

-(void) setOrigin: (XYPoint *) pt
{
if (! origin)
origin = [[XYPoint alloc] init];
origin.x = pt.x;
origin.y = pt.y;
}

该方法首先测试实例变量origin是否为非零(确保你 了解测试和使用逻辑否定运算符!那是用的)。回想起那个 所有实例变量最初都设置为零。所以当分配一个新的Rectangle对象时 其实例变量(包括origin)将设置为零。

如果原点为零,setOrigin:方法将分配并初始化一个新的 XYPoint对象并在原点中存储对它的引用。“

是否存在逻辑错误?仅当原点不为零时,“setOrigin”方法才会分配新的XYPoint对象吗?

3 个答案:

答案 0 :(得分:5)

你的引述说:

  

如果原点为零,...

也就是说,当origin为零(nil)时,! origin将为 true ,并且会分配新的XYPoint

我认为这里不存在逻辑上的矛盾。

答案 1 :(得分:1)

没有。 “!”在这种情况下是一个逻辑NOT操作。当“origin”为零时,!origin为TRUE;当“origin”为非零时,!origin为FALSE。因此,下一行(分配和初始化XYPoint对象)仅在原点为零时执行。正如作者所述。

答案 2 :(得分:0)

作者确实是正确的。

这就是为什么我不喜欢C中不完整的比较。

如果他编码if (origin),那么对于任何非{0}的origin值,该布尔表达式都为真。

所以,当他否定它时,布尔表达式if (! origin)只有在原点为零时才为真。

国际海事组织,这是可怕的,应该编码if (origin == NULL),这使它更清晰。

在我看来,他正在不遗余力地教导不良的编码习惯。这种结构总是给出Code Smell