chapter 5. Selection Statements

지환·2021년 11월 6일
0
post-custom-banner

5.1 Logical Expressions

Relational Operators

  • <
  • >
  • <=
  • >=

produce 0 (flase) or 1 (true)
mixed types is allowed

Equality Operators

  • ==
  • !=

produce 0 (flase) or 1 (true)

Logical Operators

  • !
  • &&
  • ||

produce 0 (flase) or 1 (true)
treat any nonzero operand as a true value and zero operand as a flase value

&& and || perform "short-circuit"
: left operand를 계산하고 나서 right operand를 계산함. 만약 left operand만으로 결과를 알 수 있다면 right operand는 계산되지 않음.
ex) (i != 0) && (j / i > 0)에서 i==0이라면 바로 0(false)이므로 오른쪽 expression은 계산되지 않음.
따라서 만약 오른쪽에서 side effect를 가진다면 계산되지 않을 수 있으니 주의해야한다.


5.2 The if Statement

if ( expression ) statement

parentheses around the expression are MANDATORY

Compound Statements

if Statement를 잘 보면, 뒤에 인정되는 statement는 하나밖에 없다.
근데 여러개의 statements를 쓰고 싶다면??
Compound Statement로 만들면 된다.

{ statements }

The compiler treats it as a single statement

else Clause

if ( expression ) statement else statement

Cascaded if Statements

if (~)
  ~~~~~~~
else
  if (~)
    ~~~~~~~
  else
    ~~~~~~~

형태의 구문을 그냥 indentation 없이 이어 붙인 것. 특별한 구문이 아님.

if (~)
  ~~~~~~~
else if (~)
    ~~~~~~~
else
    ~~~~~~~

The "Dangling else" Problem

else clause는 else와 짝지어지지 않은 가장 가까운 if statement에 속한다.

if (~)
  if (~)
    ~~~~~~~
else
  ~~~~~~~

그러므로 이런 indentation 잘못됐다.(잘못된건 아니지만 잘못 해석될 가능성이 큼. 왜냐하면 아래 else는 바로 위의 if와 연결되기 때문)

if (~)
  if (~)
    ~~~~~~~
  else
    ~~~~~~~

이게 올바르다고 볼 수 있다.
위에 처럼 하고 싶으면

if (~) {
  if (~)
    ~~~~~~~
} else
    ~~~~~~~

이렇게 if statement가 아니라 compound statement로 만들어 버리면, 가장 가까운 if statement와 연결되니 위에 있는 if와 연결된다.

Conditional Expressions

expr1 ? expr2 : expr3

conditional operator, ternary operator라고도 불림.
프로그램을 이해하기 어렵게 만들어서 피하는게 좋다.
하지만 return 이나 printf, macro definition에서 가끔 쓰면 좋은 경우도 있다.

Boolean Values

C89에선 매크로로 알아서 정의해서 쓸 때가 많았음.
C99에선 _Bool type을 지원.(unsigned integer type)
<stdbool.h> 헤더에선 true, false, bool(stands for _Bool) 매크로 지원.
C99에서 그냥 bool이나 boolean으로 해버리면 안됐나? 왜 이상하게 _Bool 이지?
-> 미리 존재하는 C 프로그램들이 bool이란 이름을 사용했기 때문에 옛날 코드가 작동하지 않을 수 있음.
underscore로 시작하고, 바로 uppercase letter가 따라나오는 identifier는 C89에 의해 나중에 사용하려고 예약해두고 사용하지 못해게 해뒀기 때문에 _Bool은 예전 프로그램과 충돌하지 않는다.


5.3 The switch Statement

switch ( controlling expression ) {
  case constant-expression : statements
  ...
  case constant-expression : statements
  default : statements
}

Controlling expression : integer 이어야 함.(character OK)
constant-expression : variable이나 function call 안됨. 나중에 나오는데 const qualifier가 붙은 변수도 constant expression으로 사용될 수 없음.

Duplicate case label aren't allowed
case label 순서는 상관없다. default도 꼭 필요는 없다.(default가 없는데 case가 맞는게 없으면 그냥 switch 밑으로 쭉 진행됨.)

switch statement는 그저 computed jump 기능을 제공할 뿐임. case label도 그저 위치를 나타내줄 뿐임. 따라서 각 case label 밑의 statements 마지막에 break가 없으면 다음 case label로 쭉 흘러감.

switch (grade) {
  case 4: case 3: case 2: case 1:
            printf("Passing");
            break;
  case 0:   printf("Failing");
            break;
  default:  printf("Illegal grade");
            break;

Q&A

(i>0 ? i : f) 의 type은?(i는 int형, f는 float형)
int와 float이 conditional exprssion에서 섞여있으면 그 type은 float이다. 즉 i>0이라면, 결과값은 float으로 conversion된 i값일 것이다.

post-custom-banner

0개의 댓글