2012-05-28 2 views
2

나는 사용의 이해가 안돼! if (! origin) 연산자입니다. 저자는 값이 0이 아닌지 여부를 확인하기 위해 인스턴스 변수 원점을 테스트 중이라고 설명했지만 그 의미가 무엇인지 이해하지 못했습니다.설명! 관계 연산자

#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로 평가되어야하는 조건을 테스트 할 때 자주 사용됩니다. 그러면 ! 연산자가 해당 값을 되돌립니다.

거짓, 0 또는 nil (또는 언어에 따라 널 (null)) 이외의 모든 것이 사실 일 것으로 자주 간주됩니다. 예를 들어 x = 5이 있고 if (x)을 테스트 한 경우 x이 false 또는 nil이 아닌 다른 값을 가지기 때문에 if 문의 참 조건이 실행됩니다.

이 경우에는 마치 origin이 개체에 대한 포인터 인 것처럼 보입니다. 따라서 객체를 가리키는 경우 정수 포인터 (0x ??와 같은 것)의 값이 nil이 아닌 값을 갖습니다. 그래서 (! origin)이 테스트 중입니다. '내 변수 원점이 다른 객체를 가리 키지 않습니까? 아니면 무효입니까?' 그렇다면, 코드는 원점에 새로운 값을 할당하는 것이 허용 가능하다고 판단합니다. 그러나 원점이 이전에 설정된 경우이 코드는 새 값을 지정하지 않습니다.

0

그것은 값이 초기화되고 (0과 같지 않은 포인터 시험이다 운영자 !NOT 연산자 동등 목표 -C). 클래스 된 Xypoint의 객체 origin 할당되어 있으면이 경우, 0

종류 안부 대신 객체의

0

를 해결하기 위해 가리 킵니다, 그냥 원산지가 초기화되었는지 여부를 확인합니다. 초기화되지 않은 포인터는 기본적으로 0x0 인 0x0이며 어셈블러 수준에서 false와 같습니다.

0

! 'not'를 의미하므로 "if (! origin)"은 "origin이 아닌 경우"로 번역되고 origin에 값이 있는지 여부를 테스트합니다. 이 연산자는 언어 간 의미가 다르지만 Objective-C (! origin)는 origin이 0으로 설정되면 true를 반환합니다. 그렇지 않으면 선언해야합니다. 코드가 충돌합니다. 동적 언어에서는이 연산자를 사용하여 변수가 값을 보유하고 있는지 여부도 선언되었는지 여부를 테스트 할 수 있습니다.