programing

"size of (a? true : false)"는 왜 4바이트의 출력을 제공합니까?

prostudy 2022. 6. 7. 21:30
반응형

"size of (a? true : false)"는 왜 4바이트의 출력을 제공합니까?

난 이 사건에 대한 작은 코드를 가지고 있다.sizeof연산자가 :

#include <stdio.h>
#include <stdbool.h>

int main()
{
    bool a = true;
    printf("%zu\n", sizeof(bool));  // Ok
    printf("%zu\n", sizeof(a));     // Ok
    printf("%zu\n", sizeof(a ? true : false)); // Why 4?
    return 0;
}

출력(GCC):

1
1
4 // Why 4?

근데 여기서

printf("%zu\n", sizeof(a ? true : false)); // Why 4?

가 3을 반환한다.boolean「 」의 bool은 「」입니다.1(C)

그럼 왜는 4바이트의 출력을 제공합니까?

★★★★★★★★★★★★★★★★★★★★★★★★★★.#include <stdbool.h>헤더는 매크로를 정의합니다. true ★★★★★★★★★★★★★★★★★」false1 ★★★★★★★★★★★★★★★★★」0 있어요, 이렇게 있어요.

printf("%zu\n", sizeof(a ? 1 : 0)); // Why 4?

sizeof(int)4번

는 「」, 「3」을 반환합니다.boolean 삭제,

좋아, 그게 더 있어!

C에서 이 삼원 연산의 결과는 다음과 같다.int를 클릭합니다.

그 hence hence hence hence hence 。sizeof(int)에서.


1: 견적서 1: 견적서C11 § 7.18,Boolean type and values <stdbool.h>

는 [....]에서 사용할 수 .#if지시 전처리.그들은 그렇다.

true

정수 정수 1로 확장됩니다.

false

정수 정수 0, [....]까지 확장됩니다.

참고 2: 조건부 연산자의 경우, 제6.5.15장 (강조 지뢰)

첫 번째 피연산자는 평가되며, 그 평가와 두 번째 또는 세 번째 피연산자의 평가 사이에는 시퀀스 포인트가 있습니다(어느쪽이든 평가됩니다).두 번째 피연산자는 첫 번째 피연산자가 0과 동일하지 않은 경우에만 평가됩니다.첫 번째 피연산자는 첫 번째 피연산자가 0과 동일할 경우에만 평가됩니다.결과는 두 번째 또는번째 피연산자 값입니다(어느 쪽이든 평가됩니다), [...]

그리고.

두 번째 오퍼랜드와 세 번째 오퍼랜드가 모두 산술 타입을 가지고 있는 경우, 이들 오퍼랜드에 적용되었을 경우 일반적인 산술 변환에 의해 결정되는 결과 타입이 결과 타입 [....]입니다.

그 '정수형', '정수형', '정수형', '정수형', '정수형', '정수형', '정수형'이 됩니다.int

어드바이스는, 「 」입니다.int main() 것이 int main (void)을 사용하다

삼원 연산자는 속임수이다.

    printf("%zu\n", sizeof(true));

4 ( all prints 4)sizeof(int)을 이용하다)

은 이, 음, 음, 음, 음, 음, 음, 음, the, the, the, the, the, the을 가정합니다.bool입니다.char및 """ ""1""int 크다char.

<고객명>sizeof(true) != sizeof(bool) ★★★★★★★★★★★★★★★★★」sizeof(true) == sizeof(int)한 이유일 뿐이다true유형의 표현이 아닙니다.bool 표현입니다.int. #define는 「」로서1stdbool.h

C에는 타입의 rvalue가 전혀 없습니다. 이러한 모든 rvalue는 의 인수로 사용되는 경우에도 즉시 로 승격됩니다.편집: 이 단락은 사실이 아닙니다.인수는sizeof하지 못하다int그러나 이것은 어떤 결론에도 영향을 주지 않는다.

C의 부울 타입에 대해서

부울 타입은 1999년에 C언어에 꽤 늦게 도입되었습니다.C에는 C를 사용했습니다.int모든 부울식에 적용됩니다. 모든 논리연산자(예: 'Drughta')는 'Drughta'와 같은 논리연산자()'를.> == !는 etc 는 etc를 반환한다.int가 있는1 ★★★★★★★★★★★★★★★★★」0

어플리케이션에서는 다음과 같은 수제 타입을 사용하는 것이 관례였습니다.typedef enum { FALSE, TRUE } BOOL;하자면, 이 은 '우리'가 아니라 '우리int- 이 - - -

우수하고타입인 C++를 있었습니다.bool(1개).단, 최악의 경우 C의 부울 타입 또는 식은 4바이트가 됩니다.C++와의 호환성은 C99 표준과의 C에서 도입되었습니다. 후 C는 타입 C를 했습니다._Bool, 헤더 「」도 .stdbool.h.

stdbool.h C와의 .는 매크로를 합니다.bool 철자)는 (C++의 경우)로 됩니다._Bool1바이트의 작은 정수형입니다.마찬가지로 헤더는 2개의 매크로를 제공합니다.true그리고.falseC++ 키워드와 철자가 같지만 오래된 C 프로그램과의 하위 호환성이 있습니다.그러므로true그리고.false까지 확장하다.1그리고.0C의 타입은 다음과 같습니다.int이러한 매크로는 대응하는 C++ 키워드와 같은 부울 타입이 아닙니다.

마찬가지로 이전 버전과의 호환성을 위해 C의 논리 연산자는 여전히 다음을 반환합니다.int오늘날까지 C는 부울 타입을 가지고 있지만.C++에서는 논리연산자가 a를 반환한다.bool. 따라서 다음과 같은 표현이 있습니다.sizeof(a == b)의 크기를 알 수 있습니다.int단, A의 크기입니다.boolC++로 표시됩니다.

조건부 연산자에 대해서?:

조건부 연산자?:별난 사람이란 걸 알고 있는 이상한 사람이지이것이 100%에 상당한다고 믿는 것은 흔한 실수입니다.if() { } else {}.별로 그렇지 않아요.

첫 번째 피연산자와 두 번째 또는 세 번째 피연산자의 평가 사이에는 시퀀스 포인트가 있습니다.?:연산자는 두 번째 또는 세 번째 피연산자만 평가하므로 평가되지 않은 피연산자의 부작용은 실행할 수 없습니다.코드라이크true? func1() : func2()실행되지 않음func2()아직까진 괜찮아

, 제2 및 제3의 오퍼랜드에는 암묵적으로 타입을 승격시켜 통상의 산술 변환에 의해 서로 균형을 이루도록 하는 특별한 규칙이 있다(여기서 C의 암묵적인 타입 승격 룰을 설명한다).즉, 두 번째 또는 세 번째 피연산자는 항상 최소 두 번째 또는 세 번째 피연산자 크기가int.

그러니까...true그리고.false공교롭게도 같은 종류이다intC에서 표현은 항상 최소 크기 이상의 크기를 줄 것이기 때문에int상관없어.

표현은 다음과 같이 고쳐 쓴다 해도 sizeof(a ? (bool)true : (bool)false) 그것은 여전히 그 크기를 돌려줄 것이다. int !

이는 일반적인 산술 변환을 통한 암묵적 유형 승격 때문입니다.

빠른 답변:

  • sizeof(a ? true : false)까지 평가하다.4왜냐면true그리고.false에 정의되어 있습니다.<stdbool.h>~하듯이1그리고.0각각, 그래서 그 표현은 확장된다.sizeof(a ? 1 : 0)이것은 타입이 있는 정수 표현식입니다.int플랫폼 상에서 4바이트를 차지합니다.같은 이유로sizeof(true)평가하다4를 참조해 주세요.

단, 다음 점에 주의해 주십시오.

  • sizeof(a ? a : a)또한 평가하다4왜냐하면 3차 연산자는 두 번째 및 세 번째 오퍼랜드가 정수식일 경우 정수 프로모션을 수행하기 때문입니다.물론 같은 일이 일어나다sizeof(a ? true : false)그리고.sizeof(a ? (bool)true : (bool)false)하지만 전체적인 표현은bool는 예상대로 동작합니다.sizeof((bool)(a ? true : false)) -> 1.

  • 또한 비교 연산자는 부울 값을 평가합니다.1또는0단,int입력:sizeof(a == a) -> 4.

부울 특성을 유지하는 유일한 연산자a다음과 같습니다.

  • 쉼표 연산자: bothsizeof(a, a)그리고.sizeof(true, a)까지 평가하다.1컴파일 시.

  • 할당 연산자: 둘 다sizeof(a = a)그리고.sizeof(a = true)의 가치가 있다1.

  • 증분 연산자:sizeof(a++) -> 1

마지막으로 위의 모든 것이 C에만 적용됩니다.C++는 C++에 관한 시멘틱스가 다릅니다.bool유형, 부울값true그리고.false, 비교 연산자 및 3진 연산자: 모두sizeof()표현은 평가 대상1C++로 표시됩니다.

여기 소스에 포함된 토막이 있습니다.

#ifndef __cplusplus

#define bool    _Bool
#define true    1
#define false   0

#else /* __cplusplus */

매크로가 있다true그리고.false각각 1과 0으로 선언됩니다.

그러나 이 경우 type은 리터럴 상수의 유형입니다.0과 1은 모두 int에 적합한 정수이므로 유형은 int입니다.

및 그sizeof(int)당신의 경우는 4입니다.

C에는 부울 데이터 형식이 없으며 논리식은 정수 값으로 평가됩니다.1사실이라면 그렇지 않으면0.

다음과 같은 조건식if,for,while, 또는c ? a : b정수가 필요합니다. 숫자가 0이 아니면 정수로 간주됩니다.true몇 가지 특별한 경우를 제외하고, 여기 3진법이 평가할 재귀합함수가 있다.true까지n닿다0.

int sum (int n) { return n ? n+sum(n-1) : n ;

또, 다음과 같이 사용할 수 있습니다.NULL포인터를 체크하면 싱글리 링크드 리스트의 내용을 인쇄하는 재귀 함수가 있습니다.

void print(sll * n){ printf("%d -> ",n->val); if(n->next)print(n->next); }

언급URL : https://stackoverflow.com/questions/47010910/why-does-sizeofa-true-false-give-an-output-of-four-bytes

반응형