Programmers are not to be measured by their ingenuity and their logic but by the completeness of their case analysis


operator에 비하면 statement의 종류는 꽤 적음.

앞에서 다룬 return statement와 expression statement 이외에 다른 statement는 크게 세 종류로 나눌 수 있다.


Selection statements: if and switch statements

Iteration statements: while, do, for statements

Jump statemets: break, continue, goto, return도 여기에 속함.

compound statement: 여러개의 statement를 묶어서 하나의 statement로 만듬

null statment: no action


이 장에서는 selection, compound statement를 다룸


5.1 Logical Expressions


C는 논리 연산자가 boolean type을 반환하는 것이 아니라 정수를 반환한다. 0(false) 또는 1(true)


relational operators: <, >, <=, >=

1 < 2.5의 값은 1

6 < 4의 값은 0

relational operators의 우선순위는 arithmetic operators(+-/*&)보다 낮다.


equality operators: ==, !=


logical opeators:  !, &&, ||


logical negation 

&& 

logical and 

|| 

logical or 


short-circuit evaluation: &&와 ||의 경우 첫번째 operand(피연산자)만으로 이미 값을 알 수 있는 경우, 두번째 operand는 처리하지 않는다.

ex) (i != 0) && (j / i > 0);에서 i = 0이라면, 첫번째 operand의 값이 0이므로 이 statement의 값은 뒷 operand에 상관 없이 0이 된다. 그러므로 뒷 operand를 처리하지 않고 0이 된다. 만약 뒷 operand까지 처리했다면 division by zero로 에러가 발생했을 것이다.


! 연산자는 unary plus, unary minus(+-기호)와 우선순위가 같다. &&와 ||는 relational, equality 연산자보다 우선순위가 낮다.


5.2 The if Statement

형식: if (expression) statement

if statement가 실행되면, 괄호 안의 expression의 값이 0인지 아닌지를 따져서 0이 아니면(nonzero) 괄호 뒤에 있는 statement를 실행한다.


compound statements

형식: { statements }

중괄호 안에 여러 개의 statements를 넣어 주면, 컴파일러는 그것을 하나의 statement로 인식하게 된다.

loop이나 C가 한 개의 statement를 요구하지만 우리가 여러개를 넣고 싶을 때 사용된다.


else를 사용 하는 경우

if ( expression ) statement else statement

 

cascaded if statements

if ( expression )

statement

else if ( expression )

statement

...

else if( expression )

statement

else

statement



The "Dangling else" problem

다중 if 문이 있을 때, else는 가장 가까운 if문과 짝을 이루게 된다. 파이썬처럼 indentation을 이용해더 먼 if문과 짝을 이루게 할 수 없다. 만약 바깥쪽의 if문과 else를 매치시키려면, 중괄호를 사용해 안쪽의 if문을 compound statement로 묶어야 함.


Conditional expressions

lvalue = expr 1 ? expr 2 : expr 3

if expr1 then {lvalue = expr2} else {lvalue = expr3}과 동일한 의미.


boolean values

오랫동안 C에는 적합한 boolean type이 없었다. C99에 이르러 _Bool 이란 type이 제공됨. 이 type으로 선언된 변수는 0 또는 1만 값으로 가질 수 있다.

_Bool flag;

flag = -1243; // 어떠한 nonzero value를 입력하면, flag의 값은 1로 설정된다. 

또는 <stdbool.h> 를 include해서, 

bool flag;  // _Bool flag;와 같음

flag = true; flag = false;


5.3 The switch Statement


cascaded if statement보다 읽기 편하고, case가 많다면 if보다 빠른 경우가 많다

switch ( expression ) {

case constant-expression : statements

...

case constant-expression : statements

default : statements

}


controlling expression : switch 다음에는 반드시 괄호 안에 들어있는 정수 expression이 와야 함. 소수나 문자열은 올 수 없음

case labels: 각각의 case는 case constant-expression으로 시작해야 함.

constant-expression에는 5 가능, 5 + 10 가능, 그러나 n + 10 불가능(n이 상수인 macro가 아닌 이상). 정수 또는 문자 한개여야 함.

case 다음엔 하나의 constant expression만 올 수 있지만, 

case 5: case 4: case 3: 

printf("passing");

break;

같은 형태로 여러 개의 case를 동시에 처리할 수 있다.

하나의 case를 범위로 지정하는 것은 불가능하다.

case뒤 statement 다음에 break;를 써주지 않으면 그 다음 case의 statement도 순차적으로 실행된다. 

만약 의도적으로 case 뒤에 break;를 빼먹은 거라면 그 의도를 명확히 표시해 주는것이 좋다. 왜냐하면 다른 누군가가 그걸 보고 실수라고 생각해서 break;를 추가할 수도 있기 때문이다.




+ Recent posts