목표 C: BOOL vs BOOL
타입' '새로운 타입'을 봤어요.BOOL
)YES
,NO
를 참조해 주세요.
이런 타입은 거의 char와 비슷하다고 읽었어요.
테스트의 경우:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
두 로그 모두 "1"로 표시되는 것을 보면 좋습니다(때로는 C++부울은 int이고 사이즈는 4입니다).
그래서 혹시 불 타입에 문제가 있는 건 아닌지 궁금해서요.
속도를 늦추지 않고 Bool을 사용할 수 있습니까?
의 objc.h
:
#if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
#define YES ((BOOL)1)
#define NO ((BOOL)0)
BOOL은 Char, BOOL은 Char, BOOL은 Char, BOOL은 Char, BOOL은 Char, BOOL은 라고 가정할 수 있습니다. (C99)를 할 수 .bool
그러나 애플의 Objective-C 프레임워크와 대부분의 Objective-C/Cocoa 코드는 BOOL을 사용하기 때문에 BOOL을 사용하는 것만으로 typeef가 변경되어도 두통을 줄일 수 있습니다.
작성 시점의 objc의 최신 버전입니다.h:
/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
, 및 OS , 、 64비트 iOS os 、 Watch OS 서 。BOOL
꼭 같다bool
모든 X,에서는, 「」(OS X, 32비트iOS)가 .signed char
플래그에 .-funsigned-char
또한 이 샘플코드는 플랫폼에 따라 다르게 동작합니다(자체 테스트 완료).
int myValue = 256;
BOOL myBool = myValue;
if (myBool) {
printf("i'm 64-bit iOS");
} else {
printf("i'm 32-bit iOS");
}
BTW를 .array.count
로로 합니다.BOOL
가능한 값의 약 0.4%가 음수이기 때문에 변수입니다.
BOOL
일 수 있다unsigned char
, 아키 depending type type type type type type type type type type type type type type type type type type type type type type type.bool
은 「」입니다.int
간단한 실험을 통해 BOOL과 BOOL이 다르게 동작하는 이유를 알 수 있습니다.
bool ansicBool = 64;
if(ansicBool != true) printf("This will not print\n");
printf("Any given vlaue other than 0 to ansicBool is evaluated to %i\n", ansicBool);
BOOL objcBOOL = 64;
if(objcBOOL != YES) printf("This might print depnding on your architecture\n");
printf("BOOL will keep whatever value you assign it: %i\n", objcBOOL);
if(!objcBOOL) printf("This will not print\n");
printf("! operator will zero objcBOOL %i\n", !objcBOOL);
if(!!objcBOOL) printf("!! will evaluate objcBOOL value to %i\n", !!objcBOOL);
도 ★★★★★★★★★★★★★★★★.if(objcBOOL != YES)
됩니다.YES
실제로 문자 코드 1이며, 컴파일러의 관점에서 문자 코드 64는 문자 코드 1과 동일하지 않습니다.따라서 if 스테이트먼트가 평가합니다.YES/true/1
다음 행이 실행됩니다., zero는 0이므로bool
type은 항상 정수값 1로 평가되며 위의 문제는 코드에는 영향을 주지 않습니다.하고자 할 때 한 팁입니다.Objective-C BOOL
유형 vsANSI C bool
삭제:
- 「」를 해 주세요.
YES
★★★★★★★★★★★★★★★★★」NO
다른 것은 없습니다. - ★★
BOOL
not이 아닌 not을 사용한!!
연산자를 사용하여 예기치 않은 결과를 방지합니다. - 「 」를 할 때
YES
if(!myBool) instead of if(myBool != YES)
않은 것을 .!
을 사용법
위와 같이 BOOL은 C99 standard (int)의 부호 char. bool-type입니다.
BOOL - YES/NO. BOOL - True/False.
예를 참조해 주세요.
bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");
BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");
그리고 그 결과는
b1 b b1
b2 bb2
REAL b2 2 b b2
BOOL!= BOOL에 주목하십시오.아래 결과는 ONCE AGAIN - REAL b2 뿐입니다.
b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");
BOOL을 BOOL로 변환하려면 다음 코드를 사용해야 합니다.
BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;
이 경우:
BOOL b22 = b1 ? 2 : NO;
if (b22) printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");
그래서...지금 얻을 수 있는 것은? :-)
또한 특히 비트마스크 작업을 할 때 부호 있는 문자를 캐스팅하기 때문에 캐스팅의 차이점에 유의하십시오.
bool a = 0x0100;
a == true; // expression true
BOOL b = 0x0100;
b == false; // expression true on !((TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH), e.g. MacOS
b == true; // expression true on (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
BOOL이 부울이 아닌 부호 있는 문자일 경우 0x0100에서 BOOL로의 캐스트는 단순히 세트비트를 드롭하고 그 결과 값은 0이 됩니다.
승인된 답변이 편집되어 설명이 약간 잘못되어 있습니다.코드 샘플은 갱신되었지만 아래 텍스트는 그대로입니다.BOOL은 아키텍처와 플랫폼에 따라 다르기 때문에 현재 BOOL을 char라고 가정할 수 없습니다.따라서 32비트 플랫폼(예를 들어 iPhone 5)에서 코드를 실행하고 @encode(BOOL)를 인쇄하면 "c"가 표시됩니다.char 타입에 대응합니다.그러나 iPhone 5s(64비트)에서 코드를 실행하면 "B"가 표시됩니다.불 타입에 해당됩니다.
나는 이곳의 관습에 반대한다.나는 typedef에서 base type을 좋아하지 않는다.나는 그것이 가치를 없애는 쓸모없는 간접이라고 생각한다.
- 당신의 소스에서 베이스 타입을 보면 바로 알 수 있습니다.만약 그게 타이피피라면 내가 정말 다루고 있는 게 뭔지 알아봐야겠어.
- 다른 컴파일러로 포팅하거나 다른 라이브러리를 추가할 때 typedef 세트가 충돌하여 디버깅하기 어려운 문제가 발생할 수 있습니다.사실 방금 이 일을 끝냈어요.1개의 라이브러리에서는 부울이 int로 typedef'로 입력되고 mingw/gcc에서는 char로 typedef'로 입력됩니다.
은 Objective-C 잖아요.BOOL
. 부울 되어야 합니다.따라서 모든 컴파일러의 코드 컴파일이BOOL
(Apple-Frameworks)
네, objc.h에 따르면 BOOL은 서명된 차자의 타이페프입니다.
하지만 Bool에 대해서는 잘 모르겠어요.그거 C++죠?1이 YES/true, 0이 NO/false인 부호 있는 문자로 정의되어 있다면 어떤 문자를 사용하든 상관없을 것입니다.
그러나 BOOL은 Objective-C의 일부이므로 명확성을 위해 BOOL을 사용하는 것이 더 합리적일 수 있습니다(다른 Objective-C 개발자는 BOOL이 사용 중인 것을 보면 당황할 수 있습니다).
BOOL과 BOOL의 또 다른 차이점은 키 값 관찰을 수행할 때 또는 [NSObject valueForKey:]와 같은 메서드를 사용할 때 동일한 종류의 개체로 정확하게 변환되지 않는다는 것입니다.
모두가 말했듯이, BOOL은 char이다.이와 같이 문자를 가진 NS Number로 변환됩니다.이 객체는 'A' 또는 '\0'과 같은 일반 문자로 작성된 NS넘버와 구분할 수 없습니다.당신은 원래 BOOL을 가지고 있었다는 정보를 완전히 잃어버렸습니다.
단, bool은 CFBoolan으로 변환됩니다. CFBoolan은 NS Number와 동일하게 동작하지만 객체의 부울 원점은 유지됩니다.
나는 이것이 BOOL 대 BOOL 논쟁의 논쟁이라고 생각하지 않지만, 이것은 언젠가 당신을 괴롭힐지도 모른다.
일반적으로 BOOL을 선택하는 것이 좋습니다.Cocoa/iOS API(C99 이전 설계 및 네이티브 BOOL 타입)에서는 BOOL을 사용하는 타입은 BOOL입니다.
언급URL : https://stackoverflow.com/questions/541289/objective-c-bool-vs-bool
'programing' 카테고리의 다른 글
jVisualVM에서의 샘플링과 프로파일링의 차이 (0) | 2022.08.13 |
---|---|
Java : 스트림의 올바른 문자 집합 인코딩을 확인하는 방법 (0) | 2022.08.13 |
정의와 선언의 차이점은 무엇입니까? (0) | 2022.08.13 |
Nuxt 가져오기 내에서 Vuex 작업이 "함수가 아님" (0) | 2022.08.13 |
int의 자리수를 얻는 방법? (0) | 2022.08.13 |