static은 그런 용도로 쓰는게 아니란 말이다!!

superwtk의 이미지

(제목에 또 반말써서 죄송합니다=_=..)

모의고사 직업탐구영역 프로그래밍 시험에 나왔던 문제입니다.

Quote:

[19-20] 정렬 알고리즘을 이용하여 데이터를 정렬하는 프로그램이다. 물음에 답하시오.

(들여쓰기 칸 수와 띄어쓰기 수도 그대로 옮겼습니다)

#include <stdio.h>
void main()
  {
   static int p[6]={6,5,3,7,4};
   int a, b, t;

   for(a=1; a<=5; a++){
     t=p[a];
     b=a-1;

     while(b>=0 && t<p[b])
       { ___(빈칸)____ }

     p[b+1]=t;
    }

   for(a=1; a<=5; a++)
      printf("%d ", p[a]);
  }
}

(옆에 VB코드도 있는데 주제(static 키워드)와 별로 관련이 없으므로 옮기지 않겠습니다)

19. (빈칸) 안에 들어갈 내용으로 알맞은 것은? [3점]
1. p[b]=p[a]; a--;
2. p[b]=p[a+1]; b--;
3. p[b+1]=p[b]; b++;
4. p[b]=p[b+1]; b++;
5. p[b+1]=p[b]; b--;

20. 삽입 정렬 프로그램을 완성하여 실행하였을 때, 출력된 내용 중 마지막 값으로 옳은 것은?
1. 5
2. 6
3. 7
4. 8
5. 9

저는 왜 이런 코드만 보면 스트레스를 받는걸까요 :evil:
static 키워드를 단순히 배열 요소들의 값을 0으로 초기화 하는 목적으로 쓰다니... 애들이 보고 뭘 배우겠습니까 :(

쪽팔린 얘기지만, 학교 수업시간에도 static을 배열 초기화 목적으로 사용합니다............

lifthrasiir의 이미지

superwtk wrote:
저는 왜 이런 코드만 보면 스트레스를 받는걸까요 :evil:
static 키워드를 단순히 배열 요소들의 값을 0으로 초기화 하는 목적으로 쓰다니... 애들이 보고 뭘 배우겠습니까 :(

쪽팔린 얘기지만, 학교 수업시간에도 static을 배열 초기화 목적으로 사용합니다............

음... 배열 요소들의 값을 0으로 초기화하는 목적으로 static을 쓴 것 같지는 않아 보이네요. 그냥 전역변수 쓰듯이 쓰는 모양인데... 이런 건 허용됩니다.
int arr[10]={1,2,3}; /* int arr[10]={1,2,3,0,0,0,0,0,0,0}; 과 동일 */
스펙에 다음과 같은 설명이 있으므로, 위의 배열의 나머지 부분은 항상 0으로 채워집니다.

Quote:
ISO C99, 6.7.8 (21):
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration*.

* 여기엔 안 썼지만 6.7.8 (10)에서 static storage는 항상 널 포인터, 0 등등으로 초기화된다고 쓰여 있습니다.


C++ 스펙에도 비슷한 내용이 들어 있습니다.
Quote:
ISO C++98, 8.5.1 (7):
If there are fewer initializers in the list than there are members in the aggregate*, then each member not explicitly initialized shall be default-initialized** (8.5).

* aggregate type이란 배열, struct, union 등등의, 둘 이상의 자료형이 한데 묶여 있는 형식을 말합니다.
** 마찬가지로 8.5 (5)에서 int 형의 default-initializer가 0이라고 못박아 두고 있습니다.

그나저나 들여쓰기가 참... 인상 깊군요. 학생들이 뭘 배울 지 두렵습니다 이거 -_-;

- 토끼군

kall의 이미지

20번 문제가 재밌군요..
삽입이건..버블이건..퀵이건..정렬을 했으면 제일 큰값이 마지막에올텐데 ;;
날로 먹는 문제네요 :)

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

superwtk의 이미지

kall wrote:
20번 문제가 재밌군요..
삽입이건..버블이건..퀵이건..정렬을 했으면 제일 큰값이 마지막에올텐데 ;;
날로 먹는 문제네요 :)

음.. 내림차순 정렬일수도 있죠 :)
(비교 연산자를 잘 봐야 합니다 ㅋ)

superwtk의 이미지

tokigun wrote:
음... 배열 요소들의 값을 0으로 초기화하는 목적으로 static을 쓴 것 같지는 않아 보이네요. 그냥 전역변수 쓰듯이 쓰는 모양인데... 이런 건 허용됩니다.

전역변수 쓰듯이 쓴다는게.. 무슨말인지 명확히 이해하지 못했습니다 :(
시간 되시면 부가적인 설명좀.. :)

tokigun wrote:
그나저나 들여쓰기가 참... 인상 깊군요. 학생들이 뭘 배울 지 두렵습니다 이거 -_-;

그러게 말입니다 ㅠ_ㅠ
lifthrasiir의 이미지

superwtk wrote:
tokigun wrote:
음... 배열 요소들의 값을 0으로 초기화하는 목적으로 static을 쓴 것 같지는 않아 보이네요. 그냥 전역변수 쓰듯이 쓰는 모양인데... 이런 건 허용됩니다.

전역변수 쓰듯이 쓴다는게.. 무슨말인지 명확히 이해하지 못했습니다 :(
시간 되시면 부가적인 설명좀.. :)

그러니까 이런 경우죠. 아래 두 경우 arr 배열은 프로그램 죽을 때까지 살아 있습니다.

int arr[]={....};
int main(void) { .............. }

int main(void) {
    static arr[] = {....};
    ........................
}

출제자가 전역 변수(좀 더 정확히, static storage duration)를 좋아하나 봅니다. -,.-

- 토끼군

superwtk의 이미지

아.. 그런말씀이셨군요!
근데 저런 코드에서 (main 안에 몽땅 몰아넣은..) 전역변수가 필요 있을까요 8)

그리고 한가지 더 궁금한게 있는데,
void main() 은 어디서 유래한걸까요? 터보씨?

UNIX에서는 main() 에서 int형으로 반환되는 값으로 여러가지를 판단한다고 알고있는데, 터보씨 결과물이 작동되는 환경(윈도우)에서는 그런게 필요가 없나요..?

lifthrasiir의 이미지

superwtk wrote:
아.. 그런말씀이셨군요!
근데 저런 코드에서 (main 안에 몽땅 몰아넣은..) 전역변수가 필요 있을까요 8)

그리고 한가지 더 궁금한게 있는데,
void main() 은 어디서 유래한걸까요? 터보씨?

UNIX에서는 main() 에서 int형으로 반환되는 값으로 여러가지를 판단한다고 알고있는데, 터보씨 결과물이 작동되는 환경(윈도우)에서는 그런게 필요가 없나요..?

거기에 대해서는 KLDP에 올라 왔던 글을 참고하세요. 대략 요약하자면,

  • ISO 표준에는 int main()과 int main(int, char**)의 작동만을 보장하고 있다.
  • 종종 int main(int, char**, char**)라는 prototype -- 마지막 인자는 환경 변수 -- 도 쓰이기도 하지만 표준에서 보장하지는 않는다.
  • main 함수가 int를 반환할 경우, 그 값이 EXIT_SUCCESS(보통 대부분 0)이면 프로그램이 성공적으로 끝났다는 것을 뜻하고, EXIT_FAILURE면 실패했다는 걸 뜻하며, 다른 값은 구현체마다 해석을 달리 할 수 있다.

- 토끼군

[/]
냐옹이의 이미지

superwtk wrote:
쪽팔린 얘기지만, 학교 수업시간에도 static을 배열 초기화 목적으로 사용합니다............

근데 그냥 int x[6] = ... 이런식으로 하는것하고 static int x[6] = ...이렇게 초기화 하는것이 틀린가요??? static이 배열 초기화 목적이 있는것인지 궁금합니다. 저는 static은 서브펑션에서 값이 사라지지 않고 계속 유지하기 위해서 사용하는것으로 알고 있었는데요...

------------------------
냐옹~~

tinywolf의 이미지

야옹이 wrote:
superwtk wrote:
쪽팔린 얘기지만, 학교 수업시간에도 static을 배열 초기화 목적으로 사용합니다............

근데 그냥 int x[6] = ... 이런식으로 하는것하고 static int x[6] = ...이렇게 초기화 하는것이 틀린가요??? static이 배열 초기화 목적이 있는것인지 궁금합니다. 저는 static은 서브펑션에서 값이 사라지지 않고 계속 유지하기 위해서 사용하는것으로 알고 있었는데요...

저 또한..
함수가 여러번 불리더라도 그값을 유지하기 위해서 사용하는 건줄 알고 있었습니다만...
위의 프로그램은 궂이 그럴 필요는 없었을 것같기도 하고..
출제자가 어떠한 코드에서 따내다가 그대로 가지고 오지 않았을까 하는 생각도 드네요..

ㅡ_ㅡ;

cmoh1110의 이미지

superwtk wrote:
kall wrote:
20번 문제가 재밌군요..
삽입이건..버블이건..퀵이건..정렬을 했으면 제일 큰값이 마지막에올텐데 ;;
날로 먹는 문제네요 :)

음.. 내림차순 정렬일수도 있죠 :)
(비교 연산자를 잘 봐야 합니다 ㅋ)

데이타에 있는 최소/최대 값이 3/7 인데 보기에는 7밖에 없으니
찍는다면.. 7을 찍겠죠..ㅡ.ㅡ;

IsExist의 이미지

정답을 유도하는 핵심에서 벗어나면 머리 아픕니다.
가볍게 정답만 선택해 보세요 ~.~;; (너무 무리한 것일까나..)

대게 보면 이런 사소한(?) 것에 의문을 품고 질문하던 사람들이
나중에 더 실력이 있더군요. 그냥 교사가 가르치는것만 아는
이들은 응용력도 떨어져요.

그런 점에서 super wtk 님은 자질이 좀 보이십니다. 더 정진하시길~

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치