Objective c 否定运算符逻辑没有意义

Objective c 否定运算符逻辑没有意义,objective-c,Objective C,我无法理解下面的代码。它涉及一个带有if语句的setter,该语句要求原始变量在执行之前为零(false) if语句中的否定运算符要求origin为零(false)才能执行,为什么它在origin被赋值后执行 /**implementation file **/ -(void) setOrigin : (XYPoint *) pt { if (! origin) origin = [[XYPoint alloc] init]; origin.x = pt.x;

我无法理解下面的代码。它涉及一个带有if语句的setter,该语句要求原始变量在执行之前为零(false)

if语句中的否定运算符要求origin为零(false)才能执行,为什么它在origin被赋值后执行

/**implementation file **/
-(void) setOrigin : (XYPoint *) pt
{
    if (! origin)
        origin = [[XYPoint alloc] init];

    origin.x = pt.x;
    origin.y = pt.y;
}


/** Main file **/
myPoint.x = 2;
myPoint.y = 3;

shape1.origin= myPoint;

myPoint.x = 2;
myPoint.y = 3;

shape1.origin= myPoint;

}
myRect.origin=myPoint

^^第一次出现此方法时,将执行该方法,因为实例变量为零且(!origin)有效


但是,如果我在下一行中更改myPoint的值并再次设置myRect.origin=myPoint,则setter方法将不起作用,因为(!origin)不再为true,因为它已包含上一次执行设置时的非零值。尽管有这样的逻辑,为什么它仍然执行?我错了吗?

if语句只检查origin是否存在,如果origin不存在,则在将值设置为方法参数中的值之前分配并初始化origin

基本上这是一种方便的方法。 第一次调用时,如果需要,将创建原点,然后将其设置为arg


如果原点存在,则只进行设置

您似乎对
if
语句的范围感到困惑。
if
只影响下一条语句,不考虑空格。例如:

if(NO)
    foo();
bar();
不调用
foo
,但调用
bar
;为了强调这一点,我对代码进行了适当的缩进,但重要的是要认识到缩进甚至换行对代码都没有影响。我可以这样写:

if(NO)foo();bar();
而且完全一样。正是因为这个原因,你必须注意空洞的陈述;以下是常见错误:

if(NO);
    foo();
bar();
你发现问题了吗?
if(否)末尾的分号影响(空)语句,则代码>将计为结束(空)语句!这意味着将执行
foo()
,尽管缩进有误导性。我遇到的另一个问题是:

if(NO)
//    foo();
bar();
你发现这个了吗<代码>条()
是if之后的第一条语句,因此不调用它

大括号,无论其内容如何,都是单个(复合)语句,因此:

if(NO) {}
if(NO) {
    foo();
}
if(NO) {
    foo();
    bar();
}
我不认为这里有任何意外:大括号内的所有内容都没有执行,因为大括号及其所有内容都是一条语句。使用大括号可以防止我提到的两个错误,并明确程序员的意图。出于这个原因,我建议始终使用大括号来明确表示希望
if
执行的操作

在您的特殊情况下:

if (! origin)
    origin = [[XYPoint alloc] init];

origin.x = pt.x;
origin.y = pt.y;
您可以使用大括号重写
if
,以清楚说明:

if (! origin) {
    origin = [[XYPoint alloc] init];
}

origin.x = pt.x;
origin.y = pt.y;

这意味着“如果
origin
不是一个对象,则将其初始化为一个新的
XYPoint
。如果没有,不用麻烦了,我们不需要或不想每次都创建一个新对象。但不管是否必须创建对象,将其
x
y
坐标设置为传入的坐标。

您意识到
if
语句只影响下一行,对吗?嘿@kevin,我想我在某个地方读到,如果在if/else语句中不使用括号,那么目标C中的缩进会产生很大的不同。因为origin.x=pt.x和origin.y=pt.y在if语句下没有缩进,它们不是if语句的一部分吗?不,缩进在目标c中绝对没有区别。这两条语句不是
if
语句的一部分,因为
if
只影响下一条语句,而不影响其他语句。时期(括号算作一个单独的语句,不管里面有多少)。@Kevin:如果你愿意,现在就可以发布答案。