我正在从“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对象吗?
答案 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。