C99 : 'for'의 블록 시작시 변수를 선언 할 수 있습니까?
문제
C99에 따라 다음 코드가 합법적입니까?
...
for(....) {
int x = 4;
...
}
...
3 행 전에 변수 X가 선언되지 않았다고 가정 할 수 있습니다.
지금까지 나는 다음을 발견했지만 이것이 충분하다고 생각하지 않습니다.
블록은 일련의 선언 및 진술 세트를 하나의 구문 단위로 그룹화 할 수 있도록합니다. 자동 저장 시간이있는 객체의 초기화기와 블록 스코프가있는 보통 식별자의 가변 길이 배열 선언자가 평가되고 값은 객체에 저장됩니다 (초기화가없는 객체에 불확실한 값을 저장 포함). 마치 진술 인 것처럼 실행 순서대로, 그리고 선언자가 나타나는 순서대로 각 선언 내에서.
해당 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'에 액세스하려고하는 정의되지 않은 동작이 될 것입니다.