인프런 커뮤니티 질문&답변

ohjaehokor님의 프로필 이미지
ohjaehokor

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.8 메뉴 만들기 예제

조건문에 c == 'a' 대신에, c == 'a' | 'A' 를 하면 에러가 발생합니다

작성

·

314

2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 

int printfMenu() {
	printf("Enter the letter of your choice:\n");
	printf("a. avengers     ");
	printf("b. beep\n");
	printf("c. count        ");
	printf("d. quit\n");
}
int selectA() {
	printf("Avengers assemble!\n");
}
int selectB() {
	printf("\a");
}
int selectC(){
	int n;

	printf("Enter an integer:\n");
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		printf("%d\n", i);
	}
}
int clearBuffer() {
	while (getchar() != '\n')
		continue;
}


int main() {

	char c;

	while (1) {
		printfMenu();
		c = getchar();
		printf("%c", c);

		if (c == 'a'|'A') {
			selectA();
		}
		else if (c == 'b'|'B') {
			selectB();
		} else if (c == 'c'|'C') {
			selectC();
		}
		else if (c == 'd'|'D') {
			break;
		}
		else {
			printf("Wrong input. try again.\n");
		}

		clearBuffer();


	}

	return 0;
}

강의 전에 혼자 만들어본 코드인데요.

그 전에는 모든게 정상작동되었는데,

기존의 " if(c == 소문자알파벳)" 에서

" if(c == 소문자 | 대문자 )"

로 변경하면 scanf에 무엇을 입력하던지

if (c == 'a'|'A') 가 true가 되어 실행됩니다. c에 입력이 잘못들어가는지 F10으로 확인해보려고

printf("%c", c); 코드도 추가해서 찍어봤는데,

c = 'B' 처럼 변수에 제대로 저장되어도,

조건문 if (c == 'a' | 'A')가 실행되네요. 제가 무엇을 잘못한건가요?? 어떻게 고칠수 있을까요 ?? 답변 부탁드리겠습니다 !

답변 1

1

안녕하세요, 답변 도우미 Soobak 입니다.

우선, 궁금하신 부분의 전체 코드 를 넣어주셔서 너무 감사드려요!
교수님께서도 [인프런 질문에서 답 잘 받으시는 요령] 에서 말씀해주셨듯이 이렇게 질문을 올려주시면,
저도 질문자님이 궁금하신 것이 무엇인지 더 잘 파악하게 되고, 질문자님께서도 더 만족스러운 답변을 얻으실 수 있게 되는 것 같아요. 진심으로 감사드립니다.

  1. 논리 연산자에 있어서 혼동이 있으신 것 같습니다.

    • 질문자님의 코드에서 다음 부분을 발췌해보겠습니다.

      if (c == 'a'|'A') {
        selectA();
      } else if (c == 'b'|'B') {
        selectB();
      } else if (c == 'c'|'C') {
        selectC();
      } else if (c == 'd'|'D') {
        break;
      } else {
        printf("Wrong input. try again.\n");
      }

      해당 부분에서 질문자님께서는 (a == 'a' | 'A') 와 같이 | 연산자를 사용하셨는데요,

      C언어에서 이는 비트 단위 논리 연산자 중 하나로서, 추후 15. 비트다루기 섹션에서 자세하게 학습하시게 됩니다.

    • 코드의 의도에 맞는 논리 연산자는 || 인데요, 이는 7.7 논리 연산자 Logical operators 강의를 복습해보시면 좋을 것 같습니다.

답변을 드리면서 고민을 해보았는데요, 더 자세히 설명을 드려보고 싶었지만, 지금 당장 질문자님께 비트 단위 논리 연산자와 정규 논리 연산자의 차이점 등을 모두 설명 드리기에는 내용도 방대하기도 하지만, 무엇보다 추후 다시 15. 비트다루기 섹션을 공부하시면서 훌륭한 교수님의 설명으로 더 잘 이해하실 것 같기도하고, 지금은 질문자님께서 약간의 혼동으로 오타 혹은 실수를 하신 것 같기에 문제의 원인을 알려드리는 수준에서 설명은 마무리하도록 하겠습니다.

그럼에도 불구하고, 예시로 힌트를 드려보자면,

if (c == 'a' || c == 'A') {
  selectA();
} else if (c == 'b' || c == 'B') {
  selectB();
} else if (c == 'c' || c == 'C') {
  selectC();
} else if (c == 'd' || c == 'D') {
  break;
} else {
  printf("Wrong input. try again.\n");
}

위 코드와 질문자님의 코드를 비교해서 공부해보세요!

정말 답변드리기 좋게 질문을 남겨주신 점, 다시 한번 진심으로 감사드려요!!
이해가 충분히 되셨기를 바라며, 혹시 또 궁금하신 점이 있으시다면 편하게 댓글 남겨주시면 감사하겠습니다.

감사합니다. 화이팅하세요!

ohjaehokor님의 프로필 이미지
ohjaehokor
질문자

자세한 답글 감사합니다 !

|대신 ||를 써야되는건 이제 이해하였는데,

사실 아직도 왜 c = 'B'일때

c = 'a' | 'A'가 true인지는 모르겠지만, 일단 15챕터를 듣고도 이해가 안된다면 다시 질문드릴게요 !

감사합니다 !

 

넵!! 얼마든지 편하게 또 질문 남겨주세요!! 감사합니다 :)
칭찬해주셔서 힘이 많이 나요~ 감사합니다.

질문자님도 화이팅!

ohjaehokor님의 프로필 이미지
ohjaehokor

작성한 질문수

질문하기