카테고리 없음

C언어를 처음 배웠던 시절의 코드를 다시 보았다.

카루-R 2024. 1. 17. 12:08
반응형

때는 2017년. 지금으로부터 약 7년 전이다.

초등학교 6학년 겨울방학, 컴퓨터에 푹 빠졌던 나는 부모님께 C언어 학원을 보내달라고 졸랐다.

그리고 거기서 걸으면 안 될 길을 걷고야 말았다. 세상에.

#1. 뭘 집어넣는 거야?

// 세 과목의 성적을 입력받아 합계와 평균을 구하는 프로그램
	setbuf(stdin,NULL);
	int sj = ("%d", sj);
	int sj2 = ("%d", sj2);
	int sj3 = ("&d", sj3);

// ...이하 생략

ㅋㅋㅋㅋㅋㅋ 대환장... 아마 scanf("%d", &sj);를 의도한 것 같은데, 무슨 생각으로 저랬을까. 참고로 의외지만 저 코드는 문법상으로 아무 문제가 없다. 쉼표 ',' 연산자는 두 식의 값을 평가한 후, 뒤의 것을 돌려준다. 즉 sj = sj와 같이 아무 의미 없는 코드였을 뿐.

#2. 따옴표 어디갔냐

printf("당신의이름은무엇입니까);
scanf("%s", name);
printf("%s 님의나이는몇살입니까, name);
scanf("%d", &age);
printf("%s 님의나이는%d살입니다.\n", name, age);

1번 줄과 3번 줄. 말 안 해도 알겠지?

#3. 그거 그렇게 비교하는 거 아닌데

	char ch[20];
	scanf("%s", ch);
		
	if (ch == "restart")
		printf(" Your PC is restarting....\n\n\n\n\n\n");

요즘 언어에서는 가능. 그렇지만 C에서는 문자열을 저렇게 == 비교하면 안 됩니다.

#4. 끝내게?

 
class COverUI
{
public:
	COverUI() {   }
	~COverUI() {   }
	[[noreturn]] void PrintMenu (const CBasic &rhs) noexcept { rhs.CBasic::PrintMenu(); rhs.PrintMenu(); }
	[[noreturn]] inline void PlayMenu(const CBasic &rhs) noexcept { rhs.PlayMenu(); };
	void SelectMenu(int &rMenu);
	[[nodiscard]] int RunBasic(void);
};

참고: 모던 C언어의 _Noreturn, [[noreturn]] 및 C++의 [[noreturn]]은 함수가 반환하지 않음을 나타낸다. 반환값이 없다는 뜻이 아니라, throw만 하거나, 아예 프로그램이 끝나거나, 무한루프를 돌거나. 그런데 그걸 모르고 얼씨구 하고 [[noreturn]]을 저렇게 써댔다. noreturn 속성은 함수가 컨트롤 플로우를 돌려주지 않는다는 뜻인데, 일반적인 함수에 저걸 써댔다간 무슨 일이 일어날지 모른다. (UB: Undefined Behavior)


한참 많지만, 여기 다 쓰면 여러분들 읽다 나간다. 이만 줄이도록 하겠다.

나의 실수를 반복하지 않길 바라며...

파이썬 쓰세요.

반응형