"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
★★★★★★★★★★★★★★★★★」false
1
★★★★★★★★★★★★★★★★★」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
는 「」로서1
stdbool.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++의 경우)로 됩니다._Bool
1바이트의 작은 정수형입니다.마찬가지로 헤더는 2개의 매크로를 제공합니다.true
그리고.false
C++ 키워드와 철자가 같지만 오래된 C 프로그램과의 하위 호환성이 있습니다.그러므로true
그리고.false
까지 확장하다.1
그리고.0
C의 타입은 다음과 같습니다.int
이러한 매크로는 대응하는 C++ 키워드와 같은 부울 타입이 아닙니다.
마찬가지로 이전 버전과의 호환성을 위해 C의 논리 연산자는 여전히 다음을 반환합니다.int
오늘날까지 C는 부울 타입을 가지고 있지만.C++에서는 논리연산자가 a를 반환한다.bool
. 따라서 다음과 같은 표현이 있습니다.sizeof(a == b)
의 크기를 알 수 있습니다.int
단, A의 크기입니다.bool
C++로 표시됩니다.
조건부 연산자에 대해서?:
조건부 연산자?:
별난 사람이란 걸 알고 있는 이상한 사람이지이것이 100%에 상당한다고 믿는 것은 흔한 실수입니다.if() { } else {}
.별로 그렇지 않아요.
첫 번째 피연산자와 두 번째 또는 세 번째 피연산자의 평가 사이에는 시퀀스 포인트가 있습니다.그?:
연산자는 두 번째 또는 세 번째 피연산자만 평가하므로 평가되지 않은 피연산자의 부작용은 실행할 수 없습니다.코드라이크true? func1() : func2()
실행되지 않음func2()
아직까진 괜찮아
단, 제2 및 제3의 오퍼랜드에는 암묵적으로 타입을 승격시켜 통상의 산술 변환에 의해 서로 균형을 이루도록 하는 특별한 규칙이 있다(여기서 C의 암묵적인 타입 승격 룰을 설명한다).즉, 두 번째 또는 세 번째 피연산자는 항상 최소 두 번째 또는 세 번째 피연산자 크기가int
.
그러니까...true
그리고.false
공교롭게도 같은 종류이다int
C에서 표현은 항상 최소 크기 이상의 크기를 줄 것이기 때문에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
다음과 같습니다.
쉼표 연산자: both
sizeof(a, a)
그리고.sizeof(true, a)
까지 평가하다.1
컴파일 시.할당 연산자: 둘 다
sizeof(a = a)
그리고.sizeof(a = true)
의 가치가 있다1
.증분 연산자:
sizeof(a++) -> 1
마지막으로 위의 모든 것이 C에만 적용됩니다.C++는 C++에 관한 시멘틱스가 다릅니다.bool
유형, 부울값true
그리고.false
, 비교 연산자 및 3진 연산자: 모두sizeof()
표현은 평가 대상1
C++로 표시됩니다.
여기 소스에 포함된 토막이 있습니다.
#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
'programing' 카테고리의 다른 글
스트림을 사용하여 객체 목록을 toString 메서드에서 얻은 문자열로 변환 (0) | 2022.06.07 |
---|---|
Jest로 테스트를 실행할 때 Vue 컴포넌트에 Trix 에디터가 마운트되지 않는 이유는 무엇입니까? (0) | 2022.06.07 |
세트 사용을 피해야 합니까(Preferred | Maximum |)최소)Java Swing에서 크기 조정 방법? (0) | 2022.06.07 |
슈퍼타입 리스트를 서브타입 리스트에 캐스팅하려면 어떻게 해야 합니까? (0) | 2022.06.07 |
v-model에서 조건부 연산자를 사용하시겠습니까? (0) | 2022.06.07 |