영호가 내는 간단한 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번 까지의 답은 일주일 후에.

쓰레드

아무나 참가해도 되는 건가요 ? --아영
아무나 참가해도 되는거야. --영호
네 . ^^ 근데 생각보다 어렵네요 김승욱 교수님 시험 스타일이 문득 생각나네요ㅋㅋ --아영
너무 쉬운 문제들이야 많이 생각하고 풀어봤잖아. 이쯤에선 기초에 치중한 중간 난이도의 문제가 필요하지. --영호

가독성에 대한 내용을 따로 뽑아서 가독성 페이지에 뽑아두었습니다. 이에 대한 의견 교환은 이제 새로 만들어진 페이지에서 했으면 합니다 - 임인택

틀려도 어쩔수없어요 ;; -정수민

----
분류분류
Retrieved from http://wiki.zeropage.org/wiki.php/간단한C언어문제
last modified 2021-02-07 05:28:38