영호가 내는 간단한 C언어 문제. C언어 기초를 *제대로* 배웠다면 아주 쉬운 문제가 될 것이다. *주* : 컴파일 하지말고 그냥 풀어보기 바란다. {{{~cpp Spec은 다음과 같다. 16Bit 체제의 Windows ANSI C를 규격으로 하는 Compiler (C90) }}} ※ 다음이 옳은지 옳지 않은지 평가하고 옳다면 옳다고 적고, 옳지 않으면 옳지 않다고 적고 왜 그런지 이유를 적으시오. 1. {{{~cpp #include main(){ int i; for(i=0; i<10; i++){ // 딴지 : {는 for문 뒤에 쓰는 것이 좋다. -_-. 내리는 것은 정말 좋지 않은 스타일이다.(가독성을 해친다.) printf("%d", i); } } }}} Note: - 옳다. -_- - [이영호] 안옳다. 메인함수 정의가 잘못되어있다. -yahar 옳다. -[정수민] C언어의 컴파일러에 따라 메인함수는 저렇게 쓰일 수가 있어요;;; 특정 컴파일러는 return형이 int형이 아니라고 warnning을 내기도 하죠;; - [이영호] 특정 컴파일러에 종속적인 프로그래밍은 좋지 않습니다. C90이라는 표준이 엄연히 존재하니까요. 특정 구현에 종속적인 프로그래밍을 한다고 하더라도, 프로그램의 심장은 표준에 따라 프로그래밍 하는게 좋습니다. 혹은, 그렇지 않습니다. -yuhar - 2. {{{~cpp #include main(){ int a, b; double c; a = 30000; b = 30000; c = a + b; printf("%f", c); } }}} Note: - 안옳다. 프린트에푸에있는 %f 가 %d로 바뀌면 더 예쁘게 출력될꺼같다.-[정수민] signed int형인 a와 b를 더하면 (65535/2)에서 데이터가 넘치게 되어 -숫자가 나온다. (-65536/2)+((30000+30000)-(65536/2-1)) <- 제대로 설명을 못하겠다;;; - [이영호] - 3. {{{~cpp #include main(){ const char *a; char *b, msg[]="test code"; a = msg; b = a; puts(msg); puts(msg); } }}} Note: - 옳다. 콘스트 캐릭터 별에이는 포인터의 주소 그러니까 &a 값만 변하지 않는거같다(아닌가;;)-[정수민] 옳지 않다. 문제점은 b=a;에 있다. const char *형을 char *형에 대입할 수 없다. 컴파일러 에러. - [이영호] - 4. {{{~cpp // 이 소스는 제대로 컴파일 되며, 실행도 된다. #include main(){ float num; char data[]="123.12"; num = atof(data); printf("%f", num); } }}} Note: - 안옳다. f가 아니고 s여야한다. -[정수민] 옳지않다. atof함수로 float변환은 되었지만, atof함수의 프로토 타입이 있는 헤더를 추가하지 않았기 때문에 int형으로 return된다. 즉, num엔 숫자 123이 담긴다. ANSI C99에서는 프로토타입이 선언되지 않으면 컴파일되지 않도록 변했다. - [이영호] - 5. {{{~cpp main(){ int a, b, c; a = 0010; b = 0200; c = 2000; printf("a=%d b=%d c=%dn", a, b, c); } }}} Note: - 안옳다. 최초의 0을 제외한 숫자가오는 시점부터 프린트 되는거같다. -[정수민] 옳지않다. 0을 앞에 적으면 8진수로 취급된다. 0x숫자 <- 16진수 - [이영호] - 6. {{{~cpp #include #include main(){ char ss[] = "A2 문자"; int i; puts(ss); for(i=0; ss[i]; i++){ printf("i=%d %4x(%4d) ", i, ss[i], ss[i]); if(isdigit(ss[i])) puts("숫자"); else puts("일반 문자"); } } }}} Note: - 옳지않다. ss[]의 "문자"란 단어는 isdigit로 확인 할 수 없다. (확장코드이므로.) 이것을 isdigit로 확인 하려면 unsigned char형으로 선언 하면 된다. 기본 char형은 signed형이다. - [이영호] - 7. {{{~cpp #include main(){ int i; while(scanf("%d", &i), i) printf("%d", i); } }}} Note: - 안옳다. 와일문의 조건문에는 콤마가 허용돼지 않는거같다. -[정수민] 옳다. ,의 앞은 비교문이 아니라 선행 수행으로 처리한다. - [이영호] - 8. {{{~cpp #include main(){ char *p; gets(p); puts(p); } }}} Note: - 안옳다. 단순히 포인터만 존재한다. -[정수민] 옳지않다. 포인터만 있다. - [이영호] - 9. {{{~cpp // main.h #define NUM 100 struct a { int num1; int num2; }; // main.c #include "main.h" #define NUM 200 main(){ struct a test; test.num1 = 100; test.num2 = 200; printf("%d", test.num1+test.num2); } }}} Note: - 옳다. -[정수민] 옳지 않다. NUM 상수가 2번 define 되었다. 이 경우 나중 define된 200으로 처리된다. - [이영호] - 10. {{{~cpp // 두 파일을 같이 linking //main1.c static int a = 100; int mul(int num) { printf("a = %d", a); return num*num; } //main2.c main(){ exturn int a; printf("a = %d"); printf("%d", mul(100)); } }}} Note: - 옳다. -[정수민] 옳지 않다. static은 C++의 private와 비슷하다. 한 파일이나 특정 로컬함수에서만 쓰인다는 것을 표현한다. - [이영호] - 11. {{{~cpp // 두 파일을 같이 linking // 1.c main(){ double a, b; a = 1234.1234; b = 123.123; printf("%f", mul(a, b)); } // 2.c double mul(double a, double b){ return a*b; } }}} Note: - 옳다. -[정수민] 옳지않다. 함수의 프로토 타입이 정의되지 않았기 때문에 return형이 int형으로 바뀐다. 프로토타입은 return 타입을 컴파일러에서 알기 위해 쓰이는 것이다. - [이영호] - 12. {{{~cpp main(){ }}} Note: - - 100번 까지만 내겠다. -_- 11번 까지의 답은 일주일 후에. === 쓰레드 === 아무나 참가해도 되는 건가요 ? --아영 아무나 참가해도 되는거야. --영호 네 . ^^ 근데 생각보다 어렵네요 김승욱 교수님 시험 스타일이 문득 생각나네요ㅋㅋ --아영 너무 쉬운 문제들이야 많이 생각하고 풀어봤잖아. 이쯤에선 기초에 치중한 중간 난이도의 문제가 필요하지. --영호 가독성에 대한 내용을 따로 뽑아서 [가독성] 페이지에 뽑아두었습니다. 이에 대한 의견 교환은 이제 새로 만들어진 페이지에서 했으면 합니다 - [임인택] 틀려도 어쩔수없어요 ;; -[정수민] ---- [분류분류]