본문 바로가기

개발공부(C, C++)

따배씨(따라 배우는 C언어_홍정모) Chapter7

CHAPTER 7 분기

"가장 위대한 선생님이다, 실패란 것은." __마스터 요다

7.2 표준 입출력 함수들 getchar(), putchar() 예제

printf(), scanf() 와 달리 한 글자씩 입력 받고 출력하는 함수. (하지만 진짜 한글자 한글자 처리하는 것만은 아니기 때문에 곧 배울 버퍼의 개념을 이해할 필요가 있다.)

while 문을 이용해서 문자열을 받아오는 게 가능하다. 이 때, while 문 내부에서 특정 글자를 다른 글자로 바꾼다거나 하는 다양한 작업이 가능하다. 특히 char 이 int 로 변환되어 사용된다는 점을 활용해 아스키 코드를 잘 활용한다면 효과적인 프로그래밍이 가능하다.

굳이 아스키 코드를 모두 외울 필요가 없다는 점을 알아두자! char 형이 결국 아스키 코드기 때문에 char 형을 이용해 원하는 연산을 만들어낼 수 있다.

char ch;

// 아래와 같이 씀으로써 중복 코드를 확 줄일 수 있다.
// 대입연산자의 우선순위가 낮아 괄호로 싸주어야 함에 유의
while ((ch = getchar()) != '\n')
{
  // 아스키 코드를 적극 활용하지만
  // 아스키 코드 테이블을 외울 필요 없이 사용하는 케이스
  // 대문자는 소문자로, 소문자는 대문자로
  if (ch >= 'a' &&  ch <= 'z')
  {
    ch -= 'a' - 'A'; // 물론 대문자 아스키 코드가 더 작기에 빼야한다는 건 알아야겠지
  }
  else if (ch >= 'A' && ch <='Z')
  {
    ch += 'a' - 'A';
  }

  putchar(ch);
}

7.3 ctype.h 문자 함수들

아스키 테이블을 이용해서 직접 코딩하는 대신 만들어진 함수를 이용할 수 있게 해준다.

islower(), isupper(), isdigit() 같은 자료형태 확인하는 함수부터 toupper(), tolower() 같은 변환 함수를 포함하고 있다.

isspace() 는 띄어쓰기, 줄바꿈, 탭 모두를 포함한다.

사용가능 문법리스트

7.6 소수 판단 예제

효율성을 위해 최대한 적은 수까지만 소수 판별을 하고 싶을 때 그냥 절반까지만 검사하고는 했는데, div * div <= 검사하는 수 까지만 하면 된다는 것을 알 게 되었다. 코드 주석 참고

7.7 논리 연산자 Logical operators

#include <iso646.h> 를 쓰면 &&,||,! 대신 and, or, not 을 사용할 수 있다.

&& 가 || 보다 우선순위가 높다. !(not) 은 그 둘보다도 훨씬 높다. 그러나 그냥 괄호를 쓰도록 하자.

short-circut Evaluation

&& 를 쓸 때, 앞부분에서 이미 false 이면 뒤에건 아예 실행조차 안 한다. 즉 && 의 뒷부분에 증감연산자가 있었다해도, 증감이 이루어지지 않는다. 이 성질을 이용해서 앞부분이 true 일 때만 실행될 코드를 뒷부분에 작성하는 때가 있다.

&& and || are sequence points

&& 과 || 는 sequence points 이다. 즉 && 과 || 의 앞부분은 코드 실행이 완결된다. (예: 증감연산자의 연산이 이루어짐.) 물론 이런 특성을 이용하는 코딩 스타일을 권장하지는 않는다.

7.9 조건 연산자

== 삼항연산자(ternary)

7.11 최대, 최소, 평균 구하기 예제

#include <float.h> 를 하면 -FLT_MAX, FLT_MAX를 이용해서 실수의 최대 최소 값을 min 과 max 로 설정해둘 수 있다.

7.12 다중 선택 switch 와 break

break 를 빼먹지 않도록 주의.
case 문을 연속으로 써서 2가지 조건의 경우에 같은 액션을 취하도록 할 수 있다.

char c;
while ((c=getchar()) != '.')
{
  printf("You love ");

  switch(c)
  {
  case 'a':
  case 'A': // 이게 가능.
    printf("apple)";
    break;
  case 'b':
    printf("baseball");
    break;
  default: // else와 유사
    printf("nothing");
  }
}