<
>
<=
>=
produce 0 (flase) or 1 (true)
mixed types is allowed
==
!=
produce 0 (flase) or 1 (true)
!
&&
||
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를 가진다면 계산되지 않을 수 있으니 주의해야한다.
if ( expression ) statement
parentheses around the expression are MANDATORY
if Statement를 잘 보면, 뒤에 인정되는 statement는 하나밖에 없다.
근데 여러개의 statements를 쓰고 싶다면??
Compound Statement로 만들면 된다.
{ statements }
The compiler treats it as a single statement
if ( expression ) statement else statement
if (~)
~~~~~~~
else
if (~)
~~~~~~~
else
~~~~~~~
형태의 구문을 그냥 indentation 없이 이어 붙인 것. 특별한 구문이 아님.
if (~)
~~~~~~~
else if (~)
~~~~~~~
else
~~~~~~~
else clause는 else와 짝지어지지 않은 가장 가까운 if statement에 속한다.
if (~)
if (~)
~~~~~~~
else
~~~~~~~
그러므로 이런 indentation 잘못됐다.(잘못된건 아니지만 잘못 해석될 가능성이 큼. 왜냐하면 아래 else는 바로 위의 if와 연결되기 때문)
if (~)
if (~)
~~~~~~~
else
~~~~~~~
이게 올바르다고 볼 수 있다.
위에 처럼 하고 싶으면
if (~) {
if (~)
~~~~~~~
} else
~~~~~~~
이렇게 if statement가 아니라 compound statement로 만들어 버리면, 가장 가까운 if statement와 연결되니 위에 있는 if와 연결된다.
expr1 ? expr2 : expr3
conditional operator, ternary operator라고도 불림.
프로그램을 이해하기 어렵게 만들어서 피하는게 좋다.
하지만 return 이나 printf, macro definition에서 가끔 쓰면 좋은 경우도 있다.
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
은 예전 프로그램과 충돌하지 않는다.
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;
(i>0 ? i : f)
의 type은?(i는 int형, f는 float형)
int와 float이 conditional exprssion에서 섞여있으면 그 type은 float이다. 즉 i>0이라면, 결과값은 float으로 conversion된 i값일 것이다.