#incldue <stdio.h> int main(void){ int n; printf("n: "); scanf("%d", &n); printf("%d\n",n); int array[5]; return 0; }
int array[5]; 를 printf("n "); 의 위로 옮기면 될 겁니다. C++에서는 에러가 안날지 모르지만 C에서는 에러입니다.
세벌 https://sebuls.blogspot.kr/
c의 특성인지 아닌지는 c를 이젠 안써서 모르겠지만 자동변수의 선언과 스택과 관련한 컴파일러의 제약인듯합니다.
일반적으로 선언을 하는 타이밍이 최초로 정의[보통 값을 대입시키거나 선언이 아닌 다른 구문이 있는 경우...]가 일어나는곳까지로 정하는 기법을 사용하는듯 합니다.
그래서 컴파일러가
printf("n: "); 이전까지만 선언의 블럭 혹은 구문이라고 인식을 하고 파싱을 하게 되어서 이 이후에 선언된 식별자에 대해선 parse error를 내게 됩니다.
제가 너무 알아보지도 않고 질문을 올린거 같아서..
죄송스럽습니다..
허접 질문에도 답변 주셔서 감사합니다..
C++에서만 가능하더군요...
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
참고로 gcc 3.x대부터는 C99를 지원하므로 저 코드도 아무 문제없이 컴파일 됩니다...
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
앗.. 제가 쓰고 있는게.. 3.x 버전이 아니군요..
3.x버전을 설치해야 겠네요.. 감사..
gcc 3.x부터 C99를 지원하기 때문에 선언을 실행문 중간에 쓰셔두 된다구 하셨는데요.. 그건 C99를 지원하기 때문이 아니고... gcc 컴파일러가 개발자의 편의를 위해서 넣어둔 것으로 봐야할 것 같습니다.. (C99에서 그런 내용을 본적이 없습니다...)
그리고 C로 개발하는 상황이라면 선언은 실행문 앞에 쓰는 것이 적합할 것으로 보이고 굳이 실행문 중간에 선언을 쓰고 싶다면 C++ 스타일로 코딩하는게 C++ 코딩을 하는 것이 낫지 않을까요?
중간에 선언을한다는건 선언이 아니다는 뜻이 아닐까요..
그게 가능하다면.. 동적할당 malloc 가 필요 없게되죠..완전히는 아니지만..ㅡㅡ;
그러나 선언부분에 대활호를 해보십시요.. 아마그렇게 하면 된다고 기억하고 있습니다.
#incldue <stdio.h> int main(void){ int n; printf("n: "); scanf("%d", &n); printf("%d\n",n); { int array[5]; 어쩌고 저쩌고..코딩.. } return 0; }
----------------------------------------------------------------------------
답변 감사한데요.. main() { . . .
{ 선언.. } . . . 이런식으로 하면 스코프 규칙에 따라 저 블럭 안에서만 영향력일 가지는거 아닌가요?
C99 이전에도 여러 컴파일러들이 확장으로 지원해 오던 기술임에는 틀림 없지만, C99 에서는 공식적으로 선언과 문장을 섞어쓸 수 있습니다. 10월 세미나에서도 말씀드렸지만 함수 내에서 logical block 을 나눌 때 유용할 수 있습니다.
-- Jun, Woong (woong at gmail.com)http://www.woong.org
중간에 선언을한다는건 선언이 아니다는 뜻이 아닐까요.. 그게 가능하다면.. 동적할당 malloc 가 필요 없게되죠..완전히는 아니지만..ㅡㅡ;
어떤 점에서 그렇게 생각하시죠?
#incldue <stdio.h> int main(void) { int n; // codes int array[5]; // codes return 0; }
int array[5]; 를 code 사이에 허락하는 것과 int array[n]; (즉, VLA) 를 허락하는 것은 분명 다릅니다.
답변 감사한데요.. main() { . . . { 선언.. } . . . 이런식으로 하면 스코프 규칙에 따라 저 블럭 안에서만 영향력일 가지는거 아닌가요?
맞습니다.
사실 코드 중간에 배열을 선언하려는 의도가
int n;
scanf("%d", &n);
int array[n][n];을 하기 위해서였죠..
꼼수 쓰려고 했는데 안되다니.. 쩝..ㅡㅡㅋ
C에서 편한 방법 없을까요?
사실 코드 중간에 배열을 선언하려는 의도가 int n; scanf("%d", &n); int array[n][n];을 하기 위해서였죠.. 꼼수 쓰려고 했는데 안되다니.. 쩝..ㅡㅡㅋ C에서 편한 방법 없을까요?
malloc과 free를 쓰세요. :-P
보기 좋지 않다면 매크로나 함수로 만들어서 쓰시구요.
- 죠커's blog / HanIRC:#CN
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
int array[5]; 를 printf("n "); 의 위로 옮기면 될
int array[5]; 를 printf("n "); 의 위로 옮기면 될 겁니다. C++에서는 에러가 안날지 모르지만 C에서는 에러입니다.
세벌 https://sebuls.blogspot.kr/
Re: 배열 선언 위치에 따른 에러..
c의 특성인지 아닌지는 c를 이젠 안써서 모르겠지만 자동변수의 선언과 스택과 관련한 컴파일러의 제약인듯합니다.
일반적으로 선언을 하는 타이밍이 최초로 정의[보통 값을 대입시키거나 선언이 아닌 다른 구문이 있는 경우...]가 일어나는곳까지로 정하는 기법을 사용하는듯 합니다.
그래서 컴파일러가
printf("n: "); 이전까지만 선언의 블럭 혹은 구문이라고 인식을 하고 파싱을 하게 되어서 이 이후에 선언된 식별자에 대해선 parse error를 내게 됩니다.
답변 감사합니다.
제가 너무 알아보지도 않고 질문을 올린거 같아서..
죄송스럽습니다..
허접 질문에도 답변 주셔서 감사합니다..
C++에서만 가능하더군요...
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
참고로 gcc 3.x대부터는 C99를 지원하므로 저 코드도 아무 문제없이
참고로 gcc 3.x대부터는 C99를 지원하므로 저 코드도 아무 문제없이 컴파일 됩니다...
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
앗.. 제가 쓰고 있는게.. 3.x 버전이 아니군요..3.x버전을
앗.. 제가 쓰고 있는게.. 3.x 버전이 아니군요..
3.x버전을 설치해야 겠네요.. 감사..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
gcc 3.x부터 C99를 지원하기 때문에 선언을 실행문 중간에 쓰셔두
gcc 3.x부터 C99를 지원하기 때문에 선언을 실행문 중간에 쓰셔두 된다구 하셨는데요..
그건 C99를 지원하기 때문이 아니고... gcc 컴파일러가 개발자의 편의를 위해서 넣어둔 것으로 봐야할 것 같습니다..
(C99에서 그런 내용을 본적이 없습니다...)
그리고 C로 개발하는 상황이라면 선언은 실행문 앞에 쓰는 것이 적합할 것으로 보이고 굳이 실행문 중간에 선언을 쓰고 싶다면 C++ 스타일로 코딩하는게 C++ 코딩을 하는 것이 낫지 않을까요?
중간에 선언을한다는건 선언이 아니다는 뜻이 아닐까요..그게 가능하
중간에 선언을한다는건 선언이 아니다는 뜻이 아닐까요..
그게 가능하다면.. 동적할당 malloc 가 필요 없게되죠..완전히는 아니지만..ㅡㅡ;
그러나 선언부분에 대활호를 해보십시요.. 아마그렇게 하면 된다고 기억하고
있습니다.
----------------------------------------------------------------------------
답변 감사한데요..main(){ . . .
답변 감사한데요..
main()
{
.
.
.
{
선언..
}
.
.
.
이런식으로 하면 스코프 규칙에 따라 저 블럭 안에서만 영향력일 가지는거
아닌가요?
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
[quote="for1003"]gcc 3.x부터 C99를 지원하기 때문에
C99 이전에도 여러 컴파일러들이 확장으로 지원해 오던 기술임에는 틀림
없지만, C99 에서는 공식적으로 선언과 문장을 섞어쓸 수 있습니다. 10월
세미나에서도 말씀드렸지만 함수 내에서 logical block 을 나눌 때 유용할
수 있습니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
[quote="ㅡ,.ㅡ;;"]중간에 선언을한다는건 선언이 아니다는 뜻이
어떤 점에서 그렇게 생각하시죠?
int array[5]; 를 code 사이에 허락하는 것과 int array[n]; (즉, VLA) 를
허락하는 것은 분명 다릅니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
[quote="shs0917"]답변 감사한데요..main(){
맞습니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
사실 코드 중간에 배열을 선언하려는 의도가 int n;sc
사실 코드 중간에 배열을 선언하려는 의도가
int n;
scanf("%d", &n);
int array[n][n];을 하기 위해서였죠..
꼼수 쓰려고 했는데 안되다니.. 쩝..ㅡㅡㅋ
C에서 편한 방법 없을까요?
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
[quote="shs0917"]사실 코드 중간에 배열을 선언하려는 의도가
malloc과 free를 쓰세요. :-P
보기 좋지 않다면 매크로나 함수로 만들어서 쓰시구요.
- 죠커's blog / HanIRC:#CN
댓글 달기