[C] - 선택문

Chris Kim·2024년 9월 18일

프로그래밍언어

목록 보기
5/25

논리 표현식(Logical Expressions)

관계연산자

관계연산자에는 <, >, <=, >= 가 있다. 이 연산자들은 산술연산자들보다 우선순위가 낮다.

[주의] i < j < k 를 보면 j가 i와 k사이에 있는지 확인하는 표현식으로 읽혀진다. 실제로는 아니다. 관계연산자는 좌항결합적이므로, i와 j를 비교한다. 그리고 비교한 '결과'가 참이면 1, 거짓이면 0을 계산할 것이다. 그리고 이 1 혹은 0을 k와 비교한다.

동등연산자(Equality Operator)

동등연산자에는 ==, !=가 있다. 관계연산자처럼 좌항결합적이며, 결과값이 0 혹은 1이다. 하지만 관계연산자보다 우선순위가 더 낮다.

논리연산자

논리연산자에는 !, &&, ||가 있다. 흥미로운점은 &&||는 단락(short-circuit)방식으로 계산이 이뤄진다는 점이다. 즉 참/거짓을 평가하는데 최소조건을 만족하면 후건은 계산조차 하지 않는다. 만약 &&의 좌항이 거짓이라면 우항은 계산조차 하지 않을 것이다.(필요없다) 그러므로 부-작용을 가지는 연산자들을 논리연산자와 같은 표현식에서 사용하는 경우 주의가 필요하다. 경우에 따라서는 실행되지 않을 수 있기 때문이다.

if문

if문의 일반 표현식은 다음과 같다.

if (expr) statement

여기서 표현식은 필수조건이다. 참고로 then 은 C에서는 없다. 표현식이 참인 경우 구문이 실행된다. 일단 여기서 말하는 구문은 한 개의 구문이다.

[주의] 가끔 ==을 쓴다는 것이 =을 쓰는경우가 있다. 이건 오류가 아니고, 컴파일러도 검사하지 않는다. 다만 우리가 의도한 것과 다른 결과가 나올것이다. 예를 들어 i=0면, 할당은 할당으로 이뤄지고, 언제나 거짓으로 계산될 것이다.(그 역은 조금만 생각해도 어떨지 알 수 있다.)

복합문(Compound Statement)

만약 한 개의 구문이 아닌 여러개의 구문을 쓰고 싶다면? {}으로 구문들을 감싸주면 된다. if문은 {}을 하나의 구문으로 보고, 그 내부에 있는 구문 을 실행할 것이다.

else 조항

표현식이 참이 아닌경우에 실행할 구문을 else 를 통해 삽입할 수 있다. 물론 여기에도 복합문을 사용할 수 있다. 다만 if문을 여러개 사용하는 경우에 주의해야한다. {}로 구분되어 있지 않은경우, else는 위쪽에서 가장 가까운 if와 짝을 이룬다. 따라서 여러개의 if, else를 사용하는 경우 적절하게 {}을 사용해주어야 한다.

계단식 if문

계단식 if문은 특별한 것이 아니다. 일종의 가독성을 높여주기 위한 팁이라고 이해하면 되겠다. else분기에 if문을 추가하고, 다시 else분기에 if문을 추가하고 이를 반복하면 굉장히 가독성이 좋지 않다.특히 {}을 쓰면 더욱 그럴것이다.(완전히 같은건 아니지만 파이썬의 경우를 생각해보면 다중 if문을 사용하는 경우 들여쓰기로 인해서 가독성이 무척 안좋아진다) 위에서 elseif와 짝을 이루는 성질을 활용하여 계단식 if문을 다음과 같이 표현할 수 있다.

if(expr)
	statement
else if(expr)
	statement
else if9(expr)
	statement
...
else
	statement

조건 표현식(Conditional Expressions)

if문은 다음과 같은 표현식으로 나타낼 수 있다.

expr1 ? expr2 : expr3

expr1이 참이라면 expr2을 실행하고, 거짓이라면 expr3을 실행한다.

switch문

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의 역할

각각의 케이스에 대하여 다음 케이스 라벨이 오기 전에 break가 들어간다는 것을 알게 될 것이다. 이것은 switch문의 작동을 중단하고 건너뛰게 해준다. break가 필요한 이유는 switch문이 알아서 다음 케이스 라벨을 마주치더라도 자동으로 중단되지 않기 때문이다.
switch문은 정수형 표현식과 상수형 표현식이 일치하는 라벨 부터 아래로 구문을 실행시킨다. 그러므로 {}로 구문을 감쌀 필요도 없는 것이다.

profile
회계+IT=???

0개의 댓글