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