티스토리 뷰



2015년도 정보올림피아드 지역 예선 문제는 다시 봐도 참 출제를 잘 했다 싶습니다. 틀린 문제를 통해서도 중요한 학습을 하게 할 뿐만아니라 출제된 문제들을 통해서 C언어의 주요한 부분을 만날 수 있기 때문입니다. 이번에는 C언어의 기본 문법에 대한 문제들을 다루어 볼까 합니다.

18. 다음 중 변수의 이름으로 사용할 수 없는 것은?
    ① thisway ② int_char ③ star*star ④ that_way ⑤ _6_

위의 문제는 C언어의 변수명 작성 규칙을 다룬 것으로 아래와 같이 아주 단순합니다. 

  • 변수명으로 사용할 수 있는 문자는 영문 대문자(A~Z), 소문자(a~z), 숫자(0~9), 그리고 언더스코어(_) 입니다.

  • 사용 가능한 문자 이외의 어떠한 문자도 사용할 수 없습니다(공백등의 특수 문자도 안됨)
    star*star는 허용되지 않는 문자가 있으므로 사용불가 

  • 변수명의 첫 문자로 숫자는 올 수 없습니다. 첫문자로 영문자나 언더스코어를 반드시 사용해야 합니다.

  • 예약어(Reserved word)는 변수명으로 사용할 수 없습니다. 
    int_char는 예약어 int와 char가 사용된것처럼 보이지만 중간에 _를 붙여서 예약어와는 다른 사용자 변수로 사용할 수 있습니다. 마찬가지로 continue, if, for, while등과 같어 예약어를 Continue, iF, For, whilE처럼 대문자를 섞으면 예약어와 구분되어 사용자 변수로 사용할 수 있으므로 이런 문제가 출제되면 주의해야 합니다. 

위의 변수명 작성 규칙과 함께 꼭 기억할 것은 C언어는 대소문자를 구별하는 프로그래밍 언어로 VB처럼 대문자와 소문자를 다르게 기술해도 동일하게 인식하는 것과는 차이가 있음을 기억해야 합니다. 베이직에서는 abc, Abc, ABC가 하나의 변수를 지칭하는 것이지만 C언어에서는 모두 다르게 인식한다는 것입니다. 그래서 예약어를 변수명으로 사용할 수 없지만 스펠링이 같아도 대문자를 섞으면 다른 변수로 사용할 수 있게 되는 것입니다. 변수명의 길이는 너무 길지 않게 만드는 것이 좋은데 가독성을 위해서 변수명을 길게 한다면 제한이 거의 없다고 보아도 무방합니다. 컴파일러 별로 차이가 있겠지만 작게 지원하는 컴파일러가 2048자까지 지원한답니다.


19. 다음 중 정수형 변수의 type에 해당되는 것은 어느 것인가?
    ① class ② long ③ double ④ float ⑤ struct

19번 문제는 C언어의 기본형(Basic types)과 관련성이 있는 것으로 시스템의 가장 근간을 이루는 타입이라하여 스칼라(Scalar type) 타입이라고도 합니다. 우선 정수형 타입으로는 가장 많이 사용하는 int를 비롯하여 short, long, signed, unsigned가 단독으로 또는 복합으로 변수 선언에 사용할 수 있습니다.

  • unsigned short int(unsigned short)
  • unsigned int(unsigned)
  • unsigned long int(unsigned long)
  • unsigned long long
  • signed short int(short)
  • signed int(int, signed)
  • signed long int(long)
  • signed long long(long long)

위에서 기술한 타입들이 모두 C언어에서 사용 가능한 정수형 타입입니다. 괄호 안의 타입은 동일한 효력을 내는 다른 변수 타입입니다. 예를 들어 signed int, int, signed는 모두 동일한 타입입니다. 위에서 언급한 정수형 타입과 더불어 통상 문자를 저장하는 char타입도 실상은 1바이트 메모리를 가지는 정수로 취급합니다. 그래서 부호를 갖는 signed char, unsigned char로 사용할 수 도 있습니다. 일반적으로 각 타입이 표현할 수 있는 값의 범위 또는 차지하는 메모리는 char < short < int < long < long long 이지만 컴퓨터 하드웨어가 발전함에 따라 시스템별로 각 정수형 타입이 표현하는 값의 범위와 메모리 저장 공간은 차이가 발생할 수 있습니다. 

main()
{
    printf("\n char : %d", sizeof(char));
    printf("\n short : %d", sizeof(short));
    printf("\n int : %d", sizeof(int));
    printf("\n long : %d", sizeof(long));
    printf("\n long long : %d", sizeof(long long));
}

위의 코드는 각 타입의 크기를 sizeof() 연산자로 확인하는 과정입니다. 위의 코드를 윈도우 32비트 OS에서 TCC로 컴파일하면 아래와 같은 결과가 나옵니다.

 char : 1
 short : 2
 int : 4
 long : 4
 long long : 8

어떤 시스템에서는 short과 int가 같고, 어떤 시스템에서는 int과 long이 같게 표시되는 등 차이가 있으므로 프로젝트 시작 이전에 해당 시스템의 환경을 파악하는 것이 매우 중요합니다.

정수형 타입과 함께 C언어의 대표적인 스칼라 타입은 실수형(Real types) 타입이 있습니다. 실수형은 부동소수점을 표현할 수 있는 타입으로 float, double, long double이 있습니다. float는 단정도, double을 배정도 부동소수점 타입이라고도 합니다.


20. 다음 중에서 C나 C++ 언어의 키워드에 속하는 것은?
    ① main ② function ③ double ④ the ⑤ face

20번 문제는 C언어의 예약어(Reserved word) 또는 키워드(Keyword)와 관련한 것으로 키워드는 데이터 타입 처럼 프로그래밍 언어에 있어 하나의 문법 요소로 사용하는 것을 의미하고 예약어는 키워드는 아니지만 시스템 용도나 추후 사용을 목적으로 사용자가 사용할 수 없도록 정해 놓은 것으로 구별하기도 하지만, C언어의 경우에는 예약어와 키워드를 동일하게 보아도 무방합니다.

auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while

위의 목록은 표준 ANSI C의 키워드 목록으로 컴파일러나 시스템별로 부가적인 키워드를 사용할 수도 있습니다. 20번 문제는 C언어를 접했던 사람이면 손쉽게 풀수 있는 문제이지만 많은 경우 double은 분명하게 알겠는데 main이 헷갈리다고 할 수 있습니다. C 프로그램을 작성할 때마다 main() 함수로 시작하니까 꼭 필요한 거니까 키워드아니야! 할 수 있다는 것이지요. 그러나 main은 말그대로 함수명일 뿐, 키워드는 아닙니다. main()은 윈도우나 리눅스와 같은 운영체제에서 사용자 프로그램을 실행시키기 위한 시작점(Entry point) 역할을 할 뿐입니다. 컴파일러 입장에서는 main() 함수나 사용자 정의 함수나 다를것이 없습니다. java에서도 main을 엔트리 포인트로 사용하고 있지만 C#에서는 Main이 Entry point이고 윈도우 운영체제의 GUI 응용의 Entry point는 WinMain() 입니다. 정답은 double입니다.


22. C나 C++ 언어로 작성된 프로그램에서 변수에 저장된 값을 비교할 때 사용하는 연산자가 아닌 것은?
    ① < ② <= ③ = ④ == ⑤ >=

마지막 문제는 연산자(Operators)의 차이점을 묻는 문제입니다. 비교 연산자와 대입 연산자의 개념을 명확히 이해할 수 있습니다. 우선 문제에서 말하는 비교(Comparison) 또는 관계(Relational) 연산자는 두 항에 대하여 같은지(==), 다른지(!=) 크거나 작은지(<, >, <=, >=) 결과를 참(True)과 거짓(False)으로 도출합니다. 그런데 C언어 비교 연산자의 연산 결과 참은 정수 1로, 거짓은 정수 0으로 리턴합니다. 주의할 부분은 베이직의 경우 = 연산자를 비교와 대입 모두에 사용하지만 C언어는 =와 ==를 구별하고 있으며 C언어에서는 다름을 비교하는 연산자로 !=를 사용하고 <>는 사용되지 않는다는 점입니다. 복잡한 비교를 수행할 경우에는 비교 연산자를 논리(Logical) 연산자로 연결할 수 있으며 !(Not), &&(And), !!(Or) 연산자를 참/거짓을 묶는 논리 연산으로 사용할 수 있습니다. 유의할 점은 ! > && > || 순으로 우선 순위가 적용되므로 괄호가 없는 복합 논리 연산의 경우에는 연산자의 우선 순위를 감안하여 참/거짓을 판단해야 합니다.

문제의 답인 = 연산자를 대입(Assignment) 연산자라 하는데 우측의 결과를(r-value) 좌측 변수(l-value)에 저장합니다. 결과적으로 대입 연산자의 좌측에는(l-value) 상수값이나 함수 호출등은 올 수 없고 저장소를 지정하는 변수가 와야만 합니다. = 연산자에 다른 산술 연산자와 비트 연산자를 붙여 "a = a + 1"을  "a += 1"과 같이 간편하게 기술할 수 있는 복합 대입 연산자로 +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=등을 사용할 수 있습니다.


댓글
댓글쓰기 폼
«   2022/11   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함