-
반응형
제어문이란
프로그램의 실행 흐름을 제어하는 문법
C언어에서는 특정 작업을 반복하거나 예외를 처리할 수 있도록 두 가지 제어문(조건문, 반복문)을 제공
조건문: 예외 사항에 대처하기 위한 문법
특정 조건을 부여하고 해당 조건을 만족하면 지정한 문장을 수해앟는 문법
조건은 수식으로 표현하며, 수식의 진릿값이 참(1)이면 문장을 수행
if문, switch문
반복문: 반복 행위를 효과적으로 표현하기 위한 문법
작업을 반복적으로 수행하기 위해 반복 조건을 부여하고, 해당 조건이 거짓이 될 때까지 지정한 문장을 수행하는 문법
for문, while문, do-while문
if 조건문의 구조
문법 구성이 간단하고 직관적인 표현을 사용하기 때문에 많이 사용됨
() 괄호 안에 있는 조건 수식의 결과 값이 참이면 뒤따르는 명령문 한 개를 수행
if(조건 수식) 명령문;
// 명령문1; // if (조건 수식) 명령문2; // 명령문3; #include <stdio.h> void main() { int data = 5; //명령문1 if(data > 3) printf(“data는 3보다 큰 수입니다. \n”); //명령문2 printf(“작업 종료\n”); //명령문3 }
복합 문장을 수행하는 if문
/* 명령문1; if (조건 수식) { 명령문2; 명령문3; } 명령문4; */ #include <stdio.h> void main() { int score = 90; // 명령문 1-1 char grade; // 명령문 1-2 if(score >= 90) { grade = ‘A’; //명령문2 printf(“점수는 %d이고 등급은 %c입니다.\n”, score, grade); // 명령문3 } printf(“작업 종료\n”); // 명령문4 }
구문 오류(Syntax Error)
프로그래밍 언어가 제공하는 규칙을 제대로 지키지 않았을 때 발생하는 오류
컴파일하기 전에 Visual Studio에서 오류가 난 부분에 빨간 줄로 표시
컴파일할 때 컴파일러가 체크해서 알림
의미상 오류(Semantic Error)
문법적으로는 맞지만 의미적으로 틀릴 때 발생
의미상 오류가 발생한 상황을 “버그가 발생했다”라고 표현
문법적으로는 문제가 없기 때문에 컴파일러가 오류 사항을 체크 불가능
디버깅(Debugging): 버그를 해결하기 위해 작업하는 행위
if 조건문 사용 시 주의사항 – 대입연산자와 관계연산자 혼동
// 대입 연산자를 잘못 사용한 예 int data = 5; if(data = 3) // =는 대입연산자임.. 관계연산자인 ==을 써야 올바로 참/거짓 구분 가능 // 3은 0이 아니기 때문에 if문 안으로 들어와서 명령문 수행 { data++; // data = 3 + 1 돼서 data = 4 가 됨. } /* 문법적 오류가 아닌 논리적 오류 발생 프로그램이 실행되지만 잘못된 결과 값을 출력*/
if ~ else ~
서로 반대되는 조건을 한번에 표현하는 형식
if(data == 10) data = 0; // data가 10이면 수행 if(data != 10) data++; // data가 10이 아니면 수행 // 위 조건문과 같은 코드 if(data == 10) data = 0; else data++; // data가 10이 아닌 경우에 수행됨
/* 명령문1; if (조건 수식) 명령문2; else 명령문 3; 명령문4; */ #include <stdio.h> void main() { int score = 92; char grade; if(score >= 90) { grade = ‘A’; printf(“점수는 %d이고, 등급은 %c입니다.\n”, score, grade); } else { grade = ‘B’; printf(“점수는 %d이고, 등급은 %c입니다.\n”, score, grade); } printf(“작업 종료\n”); }
조건 수식 연산자(Conditional-expression Operator, 삼항 연산자)
if~ else~ 조건문과 비슷한 형태를 가지는 연산 수식
단일 문장으로 구성된 명령문만 사용 가능
연산자이므로 명령의 결과 값을 반환
결과 값 = (조건 수식) ? 수식1 : 수식2 ;
조건 수식 연산자와 if~ else~ 조건문 비교
int value = 50000; double point; // if문 if (value >= 10000 point = value * 0.1; else point = value * 0.05; // 또는 아래와 같은 방식으로도 작성할 수도 있다. point = (value >= 10000)? value * 0.1 : value * 0.05; // // // 조건 수식 연산자를 쓰면 코드라인이 간결해짐 if(data > 5) return 1; else return 0; // 위 문장이 아래와 같이 간결해짐 return (data >5)? 1 : 0
조건 수식 연산자(삼항 연산자)의 단점
연산의 결과 값을 반환하는 구조이므로 수식을 단일 문장으로만 표현
{} 중괄호를 사용하는 복합 문장은 사용 불가
단순한 수식 표현만 사용 가능
중첩된 if 조건문
조건문 중첩 : if 조건문에 따르는 명령문 안에 조건문이 포함된 형태
중첩의 개수는 제한이 없음
중첩된 조건문의 개수가 많으면 프로그램의 수행 능력과 이해도가 떨어짐
중첩 if 조건문 예시
int score = 86; char grade; if(score >= 90) { grade = ‘A’; } else { if(score >= 80) { grade = ’B’; } else { if(score >= 70) { grade = ’C’; } else { grade= ’F’; } } } printf(“당신의 점수는 %d점이고 등급은 %c입니다\n.”,score, grade);
if~ else if~ else 조건문
- 위에서 아래쪽으로 수식의 참/거짓 여부를 판단
- 사용 빈도가 높은 조건 수식을 위쪽에 사용
#include <stdio.h> void main(){ int score = 80; char grade; if (score>=90) grade = ’A’; else if(score >=80) grade = ’B’; else if (score>=70) grade = ’C’; else if(score >=60) grade = ’D’; else grade =’F’; printf(“점수 : %d, 등급 : %c”, score, grade); }
if문이 비효율적인 경우
C언어에서는 모든 조건문을 if문으로 표현 가능
정해진 상수를 여러번 비교하는 경우 if~ else if~ else문 보다 switch문이 효율적
Switch
case 10: case 9: grade = ‘A’; break; case 8: grade = ‘B’; break;
상수와 직접적으로 비교하는 조건 형식에 유리한 문법 구조
수식을 처리하여 얻은 결과 값을 각 case 문에 있는 상수 값과 비교하여 명령문 수행
비교 대상이 상수가 아닌 경우 사용 불가
/* 명령문1; switch (수식 또는 변수) { case 상수1: 명령문2; break; case 상수2: 명령문3; break; default: 명령문4; break; } 명령문5; */
break 문
- 현재 수행되는 case문의 작업을 중단
- 프로그래머의 의도에 따라 switch문에서 break 생략 가능
- break를 만날 때까지 다음 case문의 명령문을 수행
/* 명령문1; switch (수식 또는 변수) { case 상수1: 명령문2; break; case 상수2: 명령문3; // break가 생략되면 그 다음 case도 자동으로 실행됨.. case 상수3: 명령문4; break; // 상수2를 탔으면 여기까지 진행됨 default: 명령문5; break; } 명령문5; */
default 문
- 수식의 결과 값이 case 문을 사용해 열거한 상수들과 일치하는 값이 없는 경우 수행할 명령을 적는 곳
- if 조건문의 else문과 동일한 역할
- 반드시 사용해야 하는 것은 아니기 때문에 생략 가능
- 자유롭게 위치 설정 가능 (case문 사이에 넣어도 됨)
switch문과 if ~ else if ~ else ~문 비교
// else if문 구성 int score = 86; char grade; if(score >= 90) grade =’A’; else if(score >= 80) grade =’B’; else if(score >= 70) grade =’C’; else if(score >= 60) grade =’D’; else grade = ‘F’; printf(“점수 : %d, 등급 : %c”, score, grade); /*****/ /*****/ // switch문 구성 int score = 86; char grade; switch(score / 10) { case 10: case 9: grade = ‘A’; break; case 8: grade = ‘B’; break; case 7: grade = ‘C’; break; case 6: grade = ‘D’; break; default: grade = ‘F’; break; } printf(“점수 : %d, 등급 : %c”, score, grade);
switch 조건문
- 수식의 결과값 또는 변수의 값을 여러개의 상수 값과 비교하는 것이 장점
- case 문에 변수를 적을 수 없기 때문에 비교 대상이 상수가 아닌 경우 switch문을 사용할 수 없다는 것이 단점(우회해서 사용하는 방법이 있기는 함.)
int data = 5, value = 3; switch(data) { case value: // 에러 발생 printf(“data는 value와 같다”); break; case 5: printf(“data는 5와 같다”; break; }
- 소스 코드가 길어지는 경우 한 줄에 여러 줄의 명령문을 작성
case 10: case 9: grade = ‘A’; break; case 8: grade = ‘B’; break;
반응형'C' 카테고리의 다른 글
배열 주소 (0) 2023.11.07 프로그램과 프로세스 (0) 2022.06.08 배열과 포인터의 합체 (0) 2022.05.25