의 크기와 문자의 혼동스러운 동작
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch='a';
printf("sizeof(ch) = %d\n", sizeof(ch));
printf("sizeof('a') = %d\n", sizeof('a'));
printf("sizeof('a'+'b'+'C') = %d\n", sizeof('a'+'b'+'C'));
printf("sizeof(\"a\") = %d\n", sizeof("a"));
}
이 프로그램은 다음을 사용합니다.sizeof
크기를 계산합니다. 크가의 가 기왜입니까?'a'
와의 ch
서)ch='a'
)?
sizeof(ch) = 1
sizeof('a') = 4
sizeof('a'+'b'+'C') = 4
sizeof("a") = 2
TL;DR -sizeof
피연산자 유형에서 작동합니다.
sizeof(ch)
==sizeof (char)
-------------------(1)sizeof('a')
==sizeof(int)
--------------------(2)sizeof ('a'+ 'b' + 'c')
==sizeof(int)
---(3)sizeof ("a")
==sizeof (char [2])
----------(4)
이제 각 사례를 살펴보겠습니다.
ch
는 의것로정다니의의 으로 정의됩니다.char
유형, 그래서, 꽤 간단합니다.주식회사,
sizeof('a')
는 와동합다니와 .sizeof (int)
문자 상수에 유형 정수가 있기 때문입니다.용
C11
,은 " " " " " 입니다.
int
. [...]C++에서 문자 리터럴은 다음과 같은 유형을 갖습니다.
char
.sizeof
는 컴파일 시간 연산자이므로(피연산자가 VLA인 경우 제외) 식의 유형이 사용됩니다.앞에서 말했듯이, 모든 정수 문자 상수는 유형입니다.int
,그렇게int
+int
+int
int
는 피산자유다같음습과니다형은의연같다로 잡힙니다.int
."a"
는 두 개의 는2개배니다입의 입니다.char
s,'a'
그리고.0
(슬롯-터미네이터) (아니오, 배열 유형의 첫 번째 요소에 대한 포인터로 붕괴되지 않습니다). 따라서 크기는 2개의 배열을 가진 배열과 동일합니다.char
요소들.
하지만,으로, 그긴하지만내, 침마렇,,sizeof
유형의 결과를 생성합니다.size_t
그래서 당신은 사용해야 합니다.%zu
결과를 인쇄할 형식 지정자입니다.
주식회사,'a'
유형 상수int
그것은 아닙니다.char
.그렇게sizeof('a')
와 동일할 것입니다.sizeof(int)
.
sizeof(ch)
는 와동합다니와 .sizeof(char)
(C 표준은 모든 영숫자 상수와 일부 다른 상수의 형식을 보장합니다.'a'
에 들어맞을 수 있습니다.char
,그렇게char ch='a';
항상 잘 정의되어 있습니다.)
C++에서는'a'
형식의 리터럴입니다.char
C와 C++의 또 다른 차이점.
주식회사,sizeof("a")
이라sizeof(char[2])
2. 입, 2. 다입니다.sizeof
배열 유형을 포인터로 축소하지 않습니다.
C++에서는,sizeof("a")
이라sizeof(const char[2])
2. 입, 2. 다입니다.sizeof
배열 유형을 포인터로 축소하지 않습니다.
에서, 로어언두,,'a'+'b'+'C'
입니다.int
typedue의 , C++로 integraltype을 합니다.
무엇보다도, 결과는sizeof
유형입니다.size_t
그것은 다음과 함께 인쇄되어야 합니다.%zu
형식 지정자입니다.그 부분을 무시하고 가정하는 것.int
그러면 4바이트입니다.
printf("sizeof(ch) %d\n",sizeof(ch));
1, 1로 C은, 은 C++로 합니다.은 그이는 때문입니다.
char
두 언어 모두에서 정의당 1바이트가 보장됩니다.printf("sizeof('a') %d\n",sizeof('a'));
C로 4번, C++로 1번 인쇄합니다.이것은 캐릭터 리터럴이 유형이기 때문입니다.
int
C에서1), 역사적인 이유로, 그러나 그것들은 유형입니다.char
C++에서, 그것이 상식 (및 ISO 14882)이 지시하는 것이기 때문입니다.printf("sizeof('a'+'b'+'C) %d\n",sizeof('a'+'b'+'C'));
두 언어로 4개를 인쇄합니다.의 결과 인 결유형은다음같습다니과에과서▁of▁in다▁the.
int + int + int
으로 스럽게자입니다.int
C++에는 다음과 같은 기능이 있습니다.char + char + char
그러나 +는 암묵적인 유형 승격 규칙을 호출하여 다음과 같이 끝냅니다.int
결국은 상관없이printf("sizeof(\"a\") %d\n",sizeof("a"));
두 언어로 2를 인쇄합니다.리터럴 문열리럴
"a"
이 형의입니다.char[]
와 C에const char[]
C++로.어느 경우든 우리는 다음과 같이 구성된 배열을 가지고 있습니다.a
및 null 종료 문자: 두 문자.참고로 배열이 다음과 같은 이유로 발생합니다.
"a"
피연산자가 다음으로 이동할 때 첫 번째 요소에 대한 포인터로 붕괴하지 않습니다.sizeof
예를 들어 글을 써서 배열 붕괴를 유발해야 합니까?sizeof("a"+0)
그러면 포인터의 크기를 대신 얻을 수 있습니다(4 또는 8).
1) 암흑 시대의 어딘가에는 유형이 없었고 당신이 쓴 모든 것들이 요약될 것입니다.int
상관없어.그리고 데니스 리치가 C를 위한 사실상의 표준의 어떤 방식을 함께 요리하기 시작했을 때, 그는 분명히 캐릭터 리터럴이 항상 승격되어야 한다고 결정했습니다.int
그리고 나중에 C가 표준화되었을 때, 그들은 캐릭터 리터럴이 단순히int
.
C++를 만들었을 때, Bjarne Stroustrup은 이 모든 것이 그다지 말이 되지 않는다는 것을 인식하고 캐릭터 리터럴을 유형화했습니다.char
C는 이 결함을 합니다.하지만 C 위원회는 이 언어 결함을 고치려고 완강히 거부합니다.
했듯이, C을 른다사 람들언듯이했급이, C 어표문유상정형다니의합을의수자은준언▁the로 정의합니다.int
역사적인 이유는 C와 그 이전 B가 원래 다양한 워드 크기를 가진 DEC PDP 미니 컴퓨터에서 개발되었기 때문인데, 이 컴퓨터는 8비트 ASCII를 지원하지만 레지스터에서만 연산을 수행할 수 있었습니다.은 C로 정의되었습니다.int
기계의 네이티브 워드 크기이며, a보다 작은 값입니다.int
로 확장할 필요가 있었습니다.int
기본 하드웨어가 작동하는 방식이기 때문에 함수로 전달되거나, 비트식, 논리식 또는 산술식으로 사용됩니다.
그것은 또한 정수 승격 규칙이 여전히 다음보다 작은 데이터 유형을 말하는 이유입니다.int
으로 int
로 두 개의 한 개의 할 수 , 은 단지 C 현은 또 진 진 유 한 역 보 수 개 있 대 사 보 으 수 며 할 다 니 8로 시작합니다.0
는 16진수가 필요합니다.\x
또는0x
초기 DEC 미니 컴퓨터들은 단어 크기를 3바이트 청크로 나눌 수 있지만 4바이트 니블은 가지고 있지 않다는 것입니다.
으로 자동 int
오늘은 말썽만 일으키는군요(2를 곱하는 것을 알고 있는 프로그래머의 수uint32_t
사용하는 않은 입니다. 구현에서는 정의되지 않은 동작을 정의하기 입니다.int
64비트 너비만큼, 언어는 어떤 유형의 하위 등급도 요구합니다.int
서명된 항목으로 승격해야 합니다. int
개의 2를 int
이 " 가유형가집다니을배수"입니다.int
곱셈이 서명된 64비트 제품을 오버플로할 수 있는데, 이는 정의되지 않은 동작입니까?)하지만 그것이 C와 C++가 그것을 고수하는 이유입니다.
저는 코드가 C에서 컴파일되었다고 가정합니다.
주식회사,'a'
는 로취됩다로 됩니다.int
및 타프와int
크기는 4입니다. C++에서는,'a'
는 로처됩다로 됩니다.char
.sh 에서 1165를 .sh 에서 코드를 컴파일하려고 하면 1이 반환됩니다.
언급URL : https://stackoverflow.com/questions/51173976/confusing-behavior-of-sizeof-with-chars
'programing' 카테고리의 다른 글
"이 시스템에서 스크립트 실행이 사용되지 않도록 설정되어 있으므로 Firebase를 로드할 수 없습니다.", 윈도우즈의 VSCode (0) | 2023.06.16 |
---|---|
python에서 인수 목록이 있는 함수 호출 (0) | 2023.06.16 |
웹 양식 내부에 부분 보기를 포함하는 방법 (0) | 2023.06.16 |
웹팩 4 모듈을 자스민이 멤버를 감시할 수 있도록 구성할 수 있습니까? (0) | 2023.06.11 |
JDBC 씬 드라이버에 대한 NLS_LANG 설정? (0) | 2023.06.11 |