解释!关系运算符

时间:2012-05-28 14:30:08

标签: objective-c

我不明白使用! if(!origin)中的运算符。作者解释说它正在测试实例变量origin以查看它的值是否为非零值,但我不太明白这意味着什么。

#import <Foundation/Foundation.h>

@interface XYPoint : NSObject 
@property int x, y;

@end

#import "XYpoint.h"

@implementation XYPoint
@synthesize x, y;

@end

#import <Foundation/Foundation.h>

@class XYPoint;
@interface Rectangle: NSObject

-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt; 
@end

#import "Rectangle.h"
#import "XYpoint.h"

@implementation Rectangle {
    XYPoint *origin;
}

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

origin.x = pt.x;
origin.y = pt.y
}
-(XYPoint *) origin {
    return origin;
}

@end

4 个答案:

答案 0 :(得分:0)

它正在测试值是否已初始化(指针不等于0;运算符!等同于Objective-C中的 NOT 运算符)。如果分配了类XYPoint的对象origin,它将指向对象的地址而不是0.

亲切的问候,

答案 1 :(得分:0)

在这种情况下,它只检查原点是否已初始化。未初始化的指针是0x0,基本上是0,在汇编程序级别等于false。

答案 2 :(得分:0)

!意思是'不'所以“if(!origin)”翻译为“if not origin”并且正在测试origin是否有值。此运算符在语言之间的含义不同,但在Objective-C中,如果origin设置为0,则(!origin)将返回true。必须已声明,否则您的代码将崩溃。在动态语言中,您可以使用此运算符来测试变量是否已声明是否包含值。

答案 3 :(得分:0)

!通常用于测试not。大多数情况下,您会发现在测试应该评估为真或假的条件时使用它。然后!运算符将反转该值。

除了false,0或nil(或取决于语言的null)之外的任何内容通常都被认为是真的。例如,如果我有x = 5并且我测试if (x),那么if语句的真实条件将被执行,因为x只有一个非false或nil的值。

在这种特殊情况下,看起来好像origin是指向对象的指针。因此,如果它指向一个对象,它将具有一个整数指针的非零值(类似于0x ??????)。所以(! origin)正在测试,“我的变量原点是否指向另一个对象,或者它是否为零。”如果是,则代码确定可以为源分配新值。但是,如果先前已设置origin,则此代码不会为其分配新值。