프로그램에서 어떤 조건에 따라서 수행해야 하는 행동이 달라지는 경우는 매우 빈번하게 발생한다. 따라서 프로그램언어라면 보통 명령 수행의 흐름을 바꾸는 제어 명령어가 마련되어 있으며 C/C++언어도 이를 위해서 조건 검사 명령과 반복 명령어가 있다.
if 명령문은 조건을 제어하기 위해서 사용된다. 문법은 다음과 같다.
if (조건식) {실행문1;…실행문n;} |
보다시피 아주 간단한 문장으로 조건문이 참인지 거짓인지 판별하여 조건이 참이면 바로 뒤의 중괄호 {}로 묶인 실행문들을 수행하고, 참이 아니면 수행하지 않고 다음으로 넘어간다.
만약 실행문이 하나라면 굳이 중괄호로 묶을 필요는 없으나 가독성을 위해서 사용하기도 한다. 예를 들면 다음과 같다.
if (ca == cb)cx = 10;if (cd > 10) {ce = 100;} |
if 문을 사용할 때는 몇 가지 주의할 점이 있다. 먼저 조건은 반드시 괄호로 감싸야 한다는 점이고 괄호 안의 조건은 참과 거짓을 판별할 수 있어야 한다. C언어는 내부적으로 정수 0을 거짓으로 취급하고 그 이외의 수는(보통은 1값) 모두 참으로 취급한다는 점을 유의하자. 아래의 예에서 sa=10이라는 대입문은 무조건 수행되고 예2에서 sb=sc라는 대입문은 절대로 수행되지 않는다. (왜?)
if (1) {sa = 10; // sa=10과 동일}if (0) {sb = sc;} |
또한 조건문에서 가장 하기 쉬운 실수가 ‘==’를 ‘=’로 잘 못 사용하는 경우인데 이 경우 논리적인 버그가 발생하게 된다. 예를 들면
long la = 1, lb = 1, lc;if (la = lb) {lc = 10;} |
위와 같은 경우에는 la=lb라는 표현식은 변수 la에 변수 lb값을 대입하고 그 자체로 변수 lb값인 1을 갖게 된다. 따라서 의도와 다르게 lc=10이라는 명령은 무조건 수행되게 된다. 만약 lb변수값이 0이라면 lc=10이라는 명령은 절대로 수행되지 않는다. 따라서 아래와 같이 프로그램을 수정해야 할 것이다.
long la=1, lb=1, lc;if (la == lb) {lc = 10;} |
또한 실수하기 쉬운 예가 다음과 같다.
if (la == 10);lb = lc; |
이 예의 경우 if 조건 다음의 세미콜론 ‘;’에 의해 수행문이 종료되기 때문에 조건과 관계없이 lb=lc명령이 수행된다. 실제 프로그래밍을 하다보면 쉽게 하는 실수이니 눈여겨보기 바란다.
다음의 두 예는 서로 다른 프로그램이다. 첫 번째 예는 괄호가 없기 때문에 if 조건이 첫 번째 문장에만 적용되어서 ia의 값과는 상관없이 sc++이 수행되지만, 두 번째 예는 ia가 10값일 때에만 sc++이 수행된다.
if (ia == 10)sb++;sc++; | if (ia == 10) {sb++;sc++;} |
이번에는 if 문과 항상 같이 다니는 else문에 대해서 알아보자. 기본적인 문법은 아래와 같다.
if (조건문) {명령1;...} else {명령2;...} |
else문에 포함된 명령어집합은 if 조건이 거짓일 경우 수행된다. 또한 if와 else를 조금 확장해 보면 if ~ else if 문이 된다.
if (조건문1) {명령문1;...} else if (조건문2) {명령문2;...} else {명령문3;...} |
조건문1이 참이면 명령문1을 수행하고 조건문1이 거짓이고 조건문2가 참이면 명령문2가 수행되며, 두 조건 다 거짓일 경우 명령문 3이 수행된다.
다음 예제 <if_ex01.c>은 하나의 정수를 입력받아서 짝수인지 홀수인지 판별하여 화면에 표시해주는 예제이다. 짝수라면 2로 나눈 나머지가 0일 것이고 홀수라면 1이라는 사실을 이용하면 쉽게 프로그램을 작성할 수 있다.
#include <stdio.h>int main(void){int ia;printf("Input an interger number :");scanf("%d",&ia);if (ia%2 == 0)printf("%d is an even number.\n", ia);elseprintf("%d is an odd number.\n", ia);} |
Input an interger number :22 is an even number. |
다음의 예 <if_ex02.c>는 입력된 정수가 음수인지, 0인지, 양수인지를 판별하는 예이다. if-else문이 중첩되어 사용되었음을 눈여겨보아야 한다.
#include <stdio.h>int main(void){int ia;printf("Input an interger number : ");scanf("%d",&ia);if (ia < 0)printf("%d is negative.\n", ia);else if (ia > 0)printf("%d is positive.\n", ia);elseprintf("%d is a zero.\n", ia);} |
Input an interger number : 02 is a zero. |
다음은 사용자로부터 입력 받은 문자 하나가 알파벳 소문자라면 ‘lower case’ 라고 화면에 출력하는 예제이다.
#include <stdio.h>int main(int argc, char** argv){char ch;scanf("%c", &ch);if ('a'<=ch && ch<='z' ){printf("lower case");}} |
glower case |
이 예제에서 비교문 (‘a’<=ch && ch<=’z’)는 (97<=ch && ch<=122) 와 동일하다. 문자는 내부적으로 아스키코드로 간주되기 때문이다.
위 예제어서 대문자의 경우 “upper case’라고 출력하고 숫자의 경우 ‘digit’이라고 츌력하는 부분을 추가하면 다음과 같다.
#include <stdio.h>int main(int argc, char** argv){char ch;scanf("%c", &ch);if ('a'<=ch && ch<='z' ){printf("lower case");} else if ('A'<=ch && ch<='Z' ){printf("upper case");} else if (‘0’<=ch && ch<=’9’) {printf("upper case");} else {printf("unknown");}} |
이와 같이 if - else if 문은 얼마든지 중첩하여 사용할 수 있다.
C++ 강좌 전체 목록 >>>
댓글 없음:
댓글 쓰기