2012-05-28 373 views
2

我不明白使用!運算符在if(!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 

回答

0

!通常用於測試not。大多數情況下,您會在測試應計算爲true或false的條件時使用它。 !運營商將然後扭轉該值。

除了false,0或nil(或取決於語言的null)以外,通常都會被視爲真實。例如,如果我有x = 5,並且我測試if (x),if語句的真實條件將被執行,因爲x僅具有非false或零的值。

在這種特殊情況下,看起來好像origin是一個指向對象的指針。因此,如果它指向一個對象,它將有一個非零值的整數指針(類似於0x ??????)。所以(! origin)正在測試,「我的變量原點指向另一個對象,還是零」。如果是這樣,則代碼確定將新值分配給原點是可以接受的。但是,如果之前設置了原點,則此代碼不會爲其分配新值。

0

它是測試如果該值被初始化(指針不等於0;操作者!相當於NOT操作者在目標-C)。如果類的Xypoint的對象origin分配將指向地址的對象,而不是0

親切的問候,

0

在這種情況下,它只是檢查是否起源已初始化。未初始化的指針是0x0,它基本上爲0,在彙編級別等於false。

0

!意思是「不」,所以「如果(!起源)」翻譯爲「如果不是原點」並且正在測試起源是否有價值。這個操作符在各種語言之間的意義上會有所不同,但在Objective-C中,如果origin設置爲0,則(!origin)將返回true。否則必須聲明它,否則代碼將崩潰。在動態語言中,您可以使用此運算符來測試變量是否已被聲明,以及是否保存一個值。