문자 배열 선언에서 문자열 리터럴 주위에 있는 브레이스가 유효한가?(예: char s[] = {"Hello World"})
나는 우연히나 라는 가 그 라는 것을 되었다.char s[] = {"Hello World"};
적절히 정리되어 있고, 같은 대우를 받는 것 같다.char s[] = "Hello World";
. 처음이 아닌가 (?{"Hello World"}
) 문자의 배열인 하나의 요소를 포함하는 배열로, s에 대한 선언은 읽어야 한다.char *s[]
? 사실 내가 로 바꾸면char *s[] = {"Hello World"};
컴파일러도 역시 그것을 받아들인다.
답을 찾아보니 여기밖에 없는데 기준을 언급하는 곳이 없다.
그래서 제 질문은 왜 라인이char s[] = {"Hello World"};
이 왼쪽이이 지만 이지만 된다.array of char
그리고 오른쪽은 유형이다.array of array of char
?
다음은 작업 프로그램이다.
#include<stdio.h>
int main() {
char s[] = {"Hello World"};
printf("%s", s); // Same output if line above is char s[] = "Hello World";
return 0;
}
해명해줘서 고마워.
추신. 내 컴파일러는 gcc-4.3.4.
표준에 C99 섹션 6.7.8, §14:
문자 유형의 배열은 문자 문자열 리터럴에 의해 초기화될 수 있으며, 선택적으로 가새로 둘러싸일 수 있다.문자 문자열 리터럴의 연속된 문자(공간이 있거나 배열 크기를 알 수 없는 경우 종료 null 문자 포함)는 배열의 요소를 초기화한다.
이것이 의미하는 것은 두 가지 모두
char s[] = { "Hello World" };
그리고
char s[] = "Hello World";
을 위한 통설 설탕에 지나지 않다
char s[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', 0 };
관련 참고 사항(동일한 섹션, §11)에서 C는 또한 다음과 같은 스칼라 이니셜라이저 주위에 브레이스를 허용한다.
int foo = { 42 };
우연하게도 복합 리터럴의 구문과 잘 맞아떨어진다.
(int){ 42 }
교정기는 선택사항이며, 표현은 단지 문자 배열과 같다.
다음과 같이 쓸 수도 있다.
int a = {100}; //ok
실은.C++11
이 구문을 일반화하여 배열뿐만 아니라 비구문도 균일하게 초기화한다.그래서 인C++11
, 다음과 같이 할 수 있다.
int a{}; //a is initialized to zero, and it is NOT an array
int b[]{1,2,3,4}; //b is an array of size 4 containing elements 1,2,3,4
int c[10]{}; //all 10 elements are initialized to zero
int *d{}; //pointer initialized to nullptr
std::vector<int> v{1,2,3,4,5}; //vector is initialized uniformly as well.
()의 모든 변수int
char
, 등)은 길이 1의 배열일 뿐이다.
char s = {0};
역시 효과가 있다.
내가 틀릴 수도 있지만, 내 생각에 이것은 차자의 배열은 아니고 블록에 차자의 배열은 포함되어 있다. int a = {1};
효과가 있을 수도 있다.
[...] 사실 char *s[] = {"Hello World"}(으)로 변경하면 컴파일러도 역시 예상대로 받아들인다.
컴파일러가 이를 가속하는 이유는 실제로 정의되지 않은 크기 요소의 어레이 2D를 만들 때 하나의 요소만 저장하기 때문이며"Hello World"
을하다 이와 비슷한 것:
char* s[] = {"Hello world", "foo", "baa" ...};
그 일을 빼놓을 수는 없다.bracets
이 경우에는
이는 C++ 표준에서도 허용된다. 인용:
좁은 문자 유형([기본])의 배열.basic]), char16_t 어레이, char32_t 어레이 또는 wchar_t 어레이는 각각 좁은 문자열 리터럴, char16_t 문자열 리터럴, char32_t 문자열 리터럴 또는 와이드 문자열 리터럴을 통해 초기화할 수 있으며, 가새로 둘러싸인 적절한 문자열 리터럴로 초기화할 수 있다([lex.string]).[스냅]
'Programing' 카테고리의 다른 글
표준 라이브러리를 사용하여 정렬된 메모리만 할당하는 방법 (0) | 2022.04.14 |
---|---|
Vue 선택, v-for 및 v-model이 포함된 값 사전 선택 (0) | 2022.04.14 |
Vue+webpack+vue-loader 프로젝트의 다른 js 파일에서 기능을 가져오는 방법 (0) | 2022.04.14 |
Vuex store getter는 항상 false를 반환함 (0) | 2022.04.14 |
내가 받은 구성 요소에 "프로포즈"를 추가하자 마자: 감시자 "기능" (){ 이것을 반환한다._data.$$state }" (0) | 2022.04.14 |