영호가 내는 간단한 C언어 문제.
C언어 기초를 *제대로* 배웠다면 아주 쉬운 문제가 될 것이다.
*주* : 컴파일 하지말고 그냥 풀어보기 바란다.
~cpp
Spec은 다음과 같다.
16Bit 체제의 Windows
ANSI C를 규격으로 하는 Compiler (C90)
※ 다음이 옳은지 옳지 않은지 평가하고 옳다면 옳다고 적고, 옳지 않으면 옳지 않다고 적고 왜 그런지 이유를 적으시오.
1.
~cpp
#include <stdio.h>
main(){
int i;
for(i=0; i<10; i++){ // 딴지 : {는 for문 뒤에 쓰는 것이 좋다. -_-. 내리는 것은 정말 좋지 않은 스타일이다.(가독성을 해친다.)
printf("%d", i);
}
}
Note:
-
옳다.
-
이영호
안옳다. 메인함수 정의가 잘못되어있다. -yahar
옳다. -
정수민
C언어의 컴파일러에 따라 메인함수는 저렇게 쓰일 수가 있어요;;; 특정 컴파일러는 return형이 int형이 아니라고 warnning을 내기도 하죠;; -
이영호
특정 컴파일러에 종속적인 프로그래밍은 좋지 않습니다. C90이라는 표준이 엄연히 존재하니까요. 특정 구현에 종속적인 프로그래밍을 한다고 하더라도, 프로그램의 심장은 표준에 따라 프로그래밍 하는게 좋습니다.
혹은, 그렇지 않습니다. -yuhar
-
2.
~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)) <- 제대로 설명을 못하겠다;;; -
이영호
-
3.
~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 *형에 대입할 수 없다. 컴파일러 에러. -
이영호
-
4.
~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에서는 프로토타입이 선언되지 않으면 컴파일되지 않도록 변했다. -
이영호
-
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 <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형이다. -
이영호
-
7.
~cpp
#include <stdio.h>
main(){
int i;
while(scanf("%d", &i), i)
printf("%d", i);
}
Note:
-
안옳다. 와일문의 조건문에는 콤마가 허용돼지 않는거같다. -
정수민
옳다. ,의 앞은 비교문이 아니라 선행 수행으로 처리한다. -
이영호
-
8.
~cpp
#include <stdio.h>
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번 까지의 답은 일주일 후에.