• 2024. 4. 2.

    by. 데브촙

    반응형

    제어문이란

    프로그램의 실행 흐름을 제어하는 문법

    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