programing

목표 C: BOOL vs BOOL

newsource 2022. 8. 13. 12:18

목표 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이므로booltype은 항상 정수값 1로 평가되며 위의 문제는 코드에는 영향을 주지 않습니다.하고자 할 때 한 팁입니다.Objective-C BOOL 유형 vsANSI C bool 삭제:

  • 「」를 해 주세요.YES ★★★★★★★★★★★★★★★★★」NO다른 것은 없습니다.
  • ★★BOOL not이 아닌 not을 사용한 !!연산자를 사용하여 예기치 않은 결과를 방지합니다.
  • 「 」를 할 때YESif(!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을 좋아하지 않는다.나는 그것이 가치를 없애는 쓸모없는 간접이라고 생각한다.

  1. 당신의 소스에서 베이스 타입을 보면 바로 알 수 있습니다.만약 그게 타이피피라면 내가 정말 다루고 있는 게 뭔지 알아봐야겠어.
  2. 다른 컴파일러로 포팅하거나 다른 라이브러리를 추가할 때 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