관계연산자에는 <, >, <=, >= 가 있다. 이 연산자들은 산술연산자들보다 우선순위가 낮다.
[주의]
i < j < k를 보면 j가 i와 k사이에 있는지 확인하는 표현식으로 읽혀진다. 실제로는 아니다. 관계연산자는 좌항결합적이므로, i와 j를 비교한다. 그리고 비교한 '결과'가 참이면 1, 거짓이면 0을 계산할 것이다. 그리고 이 1 혹은 0을 k와 비교한다.
동등연산자에는 ==, !=가 있다. 관계연산자처럼 좌항결합적이며, 결과값이 0 혹은 1이다. 하지만 관계연산자보다 우선순위가 더 낮다.
논리연산자에는 !, &&, ||가 있다. 흥미로운점은 &&와 ||는 단락(short-circuit)방식으로 계산이 이뤄진다는 점이다. 즉 참/거짓을 평가하는데 최소조건을 만족하면 후건은 계산조차 하지 않는다. 만약 &&의 좌항이 거짓이라면 우항은 계산조차 하지 않을 것이다.(필요없다) 그러므로 부-작용을 가지는 연산자들을 논리연산자와 같은 표현식에서 사용하는 경우 주의가 필요하다. 경우에 따라서는 실행되지 않을 수 있기 때문이다.
if문의 일반 표현식은 다음과 같다.
if (expr) statement
여기서 표현식은 필수조건이다. 참고로 then 은 C에서는 없다. 표현식이 참인 경우 구문이 실행된다. 일단 여기서 말하는 구문은 한 개의 구문이다.
[주의] 가끔
==을 쓴다는 것이=을 쓰는경우가 있다. 이건 오류가 아니고, 컴파일러도 검사하지 않는다. 다만 우리가 의도한 것과 다른 결과가 나올것이다. 예를 들어i=0면, 할당은 할당으로 이뤄지고, 언제나 거짓으로 계산될 것이다.(그 역은 조금만 생각해도 어떨지 알 수 있다.)
만약 한 개의 구문이 아닌 여러개의 구문을 쓰고 싶다면? {}으로 구문들을 감싸주면 된다. if문은 {}을 하나의 구문으로 보고, 그 내부에 있는 구문들 을 실행할 것이다.
표현식이 참이 아닌경우에 실행할 구문을 else 를 통해 삽입할 수 있다. 물론 여기에도 복합문을 사용할 수 있다. 다만 if문을 여러개 사용하는 경우에 주의해야한다. {}로 구분되어 있지 않은경우, else는 위쪽에서 가장 가까운 if와 짝을 이룬다. 따라서 여러개의 if, else를 사용하는 경우 적절하게 {}을 사용해주어야 한다.
계단식 if문은 특별한 것이 아니다. 일종의 가독성을 높여주기 위한 팁이라고 이해하면 되겠다. else분기에 if문을 추가하고, 다시 else분기에 if문을 추가하고 이를 반복하면 굉장히 가독성이 좋지 않다.특히 {}을 쓰면 더욱 그럴것이다.(완전히 같은건 아니지만 파이썬의 경우를 생각해보면 다중 if문을 사용하는 경우 들여쓰기로 인해서 가독성이 무척 안좋아진다) 위에서 else가 if와 짝을 이루는 성질을 활용하여 계단식 if문을 다음과 같이 표현할 수 있다.
if(expr)
statement
else if(expr)
statement
else if9(expr)
statement
...
else
statement
if문은 다음과 같은 표현식으로 나타낼 수 있다.
expr1 ? expr2 : expr3
expr1이 참이라면 expr2을 실행하고, 거짓이라면 expr3을 실행한다.
switch문은 다음과 같다.
switch(expr){
case consistabt-expr : statement
...
case consistabt-expr : statement
default : statement
}
switch 뒤에 ()로 감싸진 표현식은 제어표현식(Controlling expression)이라고 부른다. 이것은 반드시 정수형 표현식이어야만 한다. float형은 사용될 수 없다.
케이스 라벨(Case label) 뒤에 오는 표현식은 반드시 상수형(Constant)이어야만 한다. n + 10은 안된다.(n이 상수로 매크로-정의가 되어있다면 가능하다) 그리고 정수형이어야만 한다.(따라서 일반 문자도 된다)
운이 좋게도 구문은 {}로 감싸지지 않아도 된다. 이러한 이유는 break가 사용되는 이유와 같다.
각각의 케이스에 대하여 다음 케이스 라벨이 오기 전에 break가 들어간다는 것을 알게 될 것이다. 이것은 switch문의 작동을 중단하고 건너뛰게 해준다. break가 필요한 이유는 switch문이 알아서 다음 케이스 라벨을 마주치더라도 자동으로 중단되지 않기 때문이다.
즉 switch문은 정수형 표현식과 상수형 표현식이 일치하는 라벨 부터 아래로 구문을 실행시킨다. 그러므로 {}로 구문을 감쌀 필요도 없는 것이다.