문제

C99에 따라 다음 코드가 합법적입니까?

...
for(....) {
int x = 4;
...
}
...

3 행 전에 변수 X가 선언되지 않았다고 가정 할 수 있습니다.

C99 (PDF)

지금까지 나는 다음을 발견했지만 이것이 충분하다고 생각하지 않습니다.

블록은 일련의 선언 및 진술 세트를 하나의 구문 단위로 그룹화 할 수 있도록합니다. 자동 저장 시간이있는 객체의 초기화기와 블록 스코프가있는 보통 식별자의 가변 길이 배열 선언자가 평가되고 값은 객체에 저장됩니다 (초기화가없는 객체에 불확실한 값을 저장 포함). 마치 진술 인 것처럼 실행 순서대로, 그리고 선언자가 나타나는 순서대로 각 선언 내에서.

해당 PDF의 145 페이지에서.

도움이 되었습니까?

해결책

예, C99 (C89의 블록 시작시)에서 원하는 곳 어디에서나 변수를 선언하거나 정의 할 수 있습니다.

당신은 말했습니다 :

"3 행 전에 변수 X가 선언되지 않았다고 가정 할 수 있습니다."

이전에 선언 된 경우에도 새로운 동일한 이름으로 변수. 그렇게하면 해당 블록 내에서 이전 변수에 액세스하지 못하게됩니다.

int x = 0;               /* old x */
printf("%d\n", x);       /* old x, prints 0 */
do {
    int x = 42;          /* new x */
    printf("%d\n", x);   /* new x, prints 42 */
} while (0);
printf("%d\n", x);       /* old x, prints 0 */

C99에서 다음을 시도한 적이 없습니다. 나는 정말로 무슨 일이 일어나는지 모른다 :)
나중에 (거의) C99 컴파일러에 액세스하면 시도해 볼게요

int x = 0;
do {
    printf("%d\n", x);   /* old x? new x? crash? Undefined Behaviour? */
    int x = 42;
} while (0);

원하는 곳마다 변수를 선언/정의하는 C99 기능은 변경하고 싶은 기능이 아닙니다 :)

다른 팁

이것은 C99와 C89에서 합법적입니다. 화합물 진술을 정의하는 6.8.2를보십시오

예, 블록의 시작 부분에서 변수를 만들 수 있습니다. 블록이 C ++에 입력 될 때마다 변수가 초기화되며 블록 내 어디에서나 만들 수 있습니다.

for(....)
{
  int x=4;
  /*More code*/
}

예, 이것은 C99에서 합법적이지만 블록 후에 'X'에 액세스 할 수는 없습니다. 'X'에 액세스하려고하는 정의되지 않은 동작이 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top