Programing

문자 배열 선언에서 문자열 리터럴 주위에 있는 브레이스가 유효한가?(예: char s[] = {"Hello World"})

c10106 2022. 4. 14. 21:42
반응형

문자 배열 선언에서 문자열 리터럴 주위에 있는 브레이스가 유효한가?(예: 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

데모: http://ideone.com/z0psd

실은.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++ 표준에서도 허용된다. 인용:

[dcl.init.string] §1

좁은 문자 유형([기본])의 배열.basic]), char16_t 어레이, char32_t 어레이 또는 wchar_t 어레이는 각각 좁은 문자열 리터럴, char16_t 문자열 리터럴, char32_t 문자열 리터럴 또는 와이드 문자열 리터럴을 통해 초기화할 수 있으며, 가새로 둘러싸인 적절한 문자열 리터럴로 초기화할 수 있다([lex.string]).[스냅]

참조URL: https://stackoverflow.com/questions/10147264/braces-around-string-literal-in-char-array-declaration-valid-e-g-char-s

반응형