4.1 Relational, Equality, and Logical Operators
관계, 등가, 논리 연산자
-
관계 연산자
-> ~ 보다 작다 : <
-> ~ 보다 크다 : >
-> ~ 보다 작거나 같다 : <=
-> ~ 보다 크거나 같다 : >=
-
등가 연산자
-> 같다 : ==
-> 같지 않다 : !=
-
논리 연산자
-> (단항) 부정 : !
-> 논리곱 : &&
-> 논리합 : ||
-
연산 결과
-> false : zero
-> true : nonzero
우선순위, 결합법칙 (시험문제에 나옴) (무조건 외워라)
| 연산자 | 결합법칙 |
|---|
| (), ++(postfix), --(postfix) | L->R |
| +(unary), -(unary), ++(prefix), --(prefix) | R->L |
| */% | L->R |
| + - | L->R |
| <, <=, >, >= | L->R |
| ==, != | L->R |
| && | L->R |
| ' | |
| ?: | R->L |
| =, +=, -=, *=, /= etc. | R->L |
| , | L->R |
4.2 Relational Operators and Expressions
관계 연산자와 수식
-
관계연산자(이항연산자)
-> <, >, <=, >=
-
예
-> a < 3
-> a > b -> (a-b) < 0 으로 구현
-> -1.3 >= (2.0 x + 3.3)
-> a < b < c / syntactically correct, but confusing */
틀린 예
a - b의 값과 관계식

시험문제에 나옴

4.3 Equality Operators and Expressions
등가 연산자와 수식
- 등가 연산자 == 와 != 는 이항 연산자
- 예
-> c=='A'
-> k !=2
-> x + y == 3*z -7
잘못된 사용 예
- a = b
- a = = b - 1
- (x + y) =! 44

(연산의 우선순위) (굉장히 중요함)

Common Programming Error
if (a = 1)
a == 1이라고 해야함. a=1은 assign이라고 부름
4.4 Logical Operators and Expressions
논리 부정 연산자 !
- 식이 0 값을 가지면 그것의 부정인 정수값 1이 생성.
- 식이 0이 아닌 값을 가지고 있으면 그것의 부정인 정수값 0을 생성
- 예
-> !a
-> !(x + 7.7)
-> !(a < b || c < d)
잘못 사용된 예

-
논리학 not(not s) = s
-
!!5 의 값은 1
(시험문제에 나옴)


예시
- a && b
- a || b
- !(a<b) && c
- 3 && (-2 * a + 7)
잘못 사용된 예


단축 평가 (Short-Circuit Evaluation)
-
결과가 참인지 거짓인지 판명되면 더 이상 다음 수식을 평가하지 않는다
-
expr1 && expr2
-> expr1이 0이면 어차피 0이므로 expr2 평가하지 않음
-
expr1 || expr2
-> expr1이 1이면 어차피 1이므로 expr2 평가하지 않음
-
예
-> if ((3<2) && (4<5)) a = 4;
-> if ((3>2) || (4<5)) a = 4;
단축평가를 사용한 간단한 예

4.5 The compound Statement
복합문
- 복합문은 중괄호 {} 로 묶여진 선언문과 실행문.
- compound_statement := {{declaration}_0+ {statement}_0+}

수식 문장과 공백 문장
- expr_statement ::= {expr}_opt ;
- 예:

4.7 The if and if-else Statements
if 와 else 문
-> 만일 expr이 0이 아니면 (true) statement 실행
-> 그렇지 않으면 statement는 실행되지 않고 다음 문장으로 넘어감
-
if (grade >= 90)
printf("Congratulations!\n");
printf("your grade is %d.\n", grade);
올바른 If 문의 예
-
if (y!= 0.0)
x/=y;
-
if (c == ' ') {
++blank_cnt
printf()
}
참조

if-else 문


4.8 The while Statement
While 문
-
while (expr)
statement
-> expr이 0이 아니면 statement를 실행한 후, 다시 while루프의 시작 부분으로 돌아감
-> expr이 0이면 다음 문장으로 진행함
-
while (i++ < n)
factorial *= i;


4.9 The for statement
for 문
- for (expr1; expr2; expr3)
statement
-> 우선 expr1을 실행 후 expr2가 0이 아니면, statement를 실행한 후, expr3를 수행함
-> expr2가 0이면, 다음 문장으로 진행
4.11 The commpa Operator
-
expr1, expr2
-> expr1이 먼저 평가되고, 그 다음 expr2가 평가됨
-> 전체 수식의 값과 형은 가장 오른쪽 피연산자를 따름
-> 가장 낮은 우선순위 갖는 이항 연산자
-> L-> R 결합법칙
-
프로그램 상의 대부분의 콤마는 콤마 연산자가 아님
-> 함수의 인자 목록에서 수식을 분리하는데 사용된 콤마
-> 초기화 목록에서 사용된 콤마


4.12 The do Statement
do 문
- do
statement
while (expr);
-> 먼저 statement를 실행한 후, expr이 0이 아니면 do문의 시작 부분으로 돌아감
-> expr이 0이면 다음 문장으로 진행
-> do문은 while문의 변형된 형태
-> while문은 루프 상단에서 조건을 검사하는 반면 do문은 루프 하단에서 조건을 검사


4.14 The goto Statement
goto 문 (중요하지 않음)
- 현대 프로그래밍 방법론에서 유해한 구조물로 간주
- 현재 함수내의 레이블이 붙은 문장으로 무조건 분기함으로써 다른 제어 흐름 매커니즘들이 제공하는 유용한 구조를 파괴
4.15 The break and Continue Statements
Break 문
- break와 continue는 정상적인 제어의 흐름을 중단시킴
- break 문은 루프의 내부나 switch 문으로 부터 빠져나옴
Continue 문
- continue 문은 for, while, do 루프의 현재 반복 동작을 멈추고 즉시 다음 반복을 하게 함
4.16 The Switch Statement
switch 문
- Switch 문은 if-else 문을 일반화한 다중 조건문
- switch 다음에 오는 괄호안에 사용되는 제어식은 반드시 정수적형
- 제어식의 평가 결과에 따라 제어는 해당되는 case레이블로 분기
4.17 The Conditional Operator(시험문제에 나옴)


-> min(y, z)를 뜻함

HomeWork
- Exercises : 1, 11, 13, 19, 33