Objective c 否定运算符逻辑没有意义
我无法理解下面的代码。它涉及一个带有if语句的setter,该语句要求原始变量在执行之前为零(false) if语句中的否定运算符要求origin为零(false)才能执行,为什么它在origin被赋值后执行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;
/**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:如果你愿意,现在就可以发布答案。