0

我正在向“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对象被分配后,它的实例变量,包括原点,将被设置为零。

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

有没有逻辑错误?只有当原点不为零时,“setOrigin”方法才分配一个新的 XYPoint 对象?

4

3 回答 3

5

你的报价说:

如果原点为零,...

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

我在这里没有看到逻辑上的不一致。

于 2012-10-15T03:42:06.943 回答
1

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

于 2012-10-15T03:44:00.127 回答
0

作者确实是对的。

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

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

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

IMO,这太可怕了,应该对其进行编码if (origin == NULL),以使其更清晰。

在我看来,他正在竭尽全力教导不良的编码习惯。这种结构总是会散发出Code Smell的味道。

于 2012-10-15T03:38:01.217 回答