컴퓨터 프로그래밍/C

C언어 제어문 (if / if else / else if)

나노콛 2019. 7. 18. 14:23

지난 편 문제 풀이


제어문

제어문은 조건이 참이면 하는 작업과
거짓이면 하는 작업을 구분 지을 수 있습니다.

 

#include <stdio.h>
int main()
{
	int a = 0;

	if (a < 5)
	{
		printf("a < 5 \n");
	}

	if (a)
	{
		printf("a\n");
	}

	return 0;
}

if() 안에는 조건식, 변수, 값, 등등을 넣을 수 있습니다.
보통은 (변수가 포함된) 조건식을 넣죠
그러나 특징을 한번 알아보는 시간이 되었으면 합니다.

0이 아닌 모든 수가 참이라는 것은 앞에서 이야기해왔습니다.
이 기준은 끝까지 함께하는 기준이 될 것입니다.

a가 0이라 a < 5 식에서 참이 됩니다.
이 관계연산자에서 꼭 기억해야 할 내용은
연산자 왼쪽이 기준이 된다는 사실입니다.
a가 5보다 작으면이라는 얘기가 됩니다.

참이면 if의 구역이 블록으로 정해져 있으니 
해당 if 문 구역 안 출력문으로 진행하게 됩니다.
거짓이면 내부로 진입하지 않습니다.

두 번째 if(a)는 a의 값이 0이 들어가 있기 때문에
0은 거짓이 되며 안의 내용을 실행하지 않게 됩니다.

 

int a=3;

1. if(a<5)
    printf("a\n");
    printf("b\n");
    printf("c\n");

2. if(a<5) printf("a\n");
   printf("b\n");

3. if(1 < a < 7)
   printf("a\n");

4. if('a')
   printf("a\n");

5. if('a'-97)
   printf("a\n");

6. if("안녕하세요")
   printf("a\n");

7. if(1 + 3 = a)
   printf("a\n");

위의 다양한 조건들이 있습니다.
보통은 저렇게 쓸 이유가 없어서
모르는 경우가 많을 것 같습니다..

1. if(a<5) 
    printf("a\n"); 
    printf("b\n"); 
    printf("c\n");

if의 구역이 정해지지 않았을 경우에는
if 문의 영향은 바로 다음 문장까지 효과를 받습니다.
그래서 조건은 참이기 때문에 a b c 모두 출력이 됩니다.

2. if(a<5) printf("a\n"); 
   printf("b\n");

1번과 비슷한 형태인데
if 문의 영향은 바로 다음 문장까지 효과를 받기 때문에
문장의 끝은 ;으로 나타내기 때문에
다음 문장의 끝 ;까지 만 영향을 줍니다.

그래서 조건이 참이라서
a b 모두 출력됩니다.
(거짓이라면 b만 출력될 것입니다.)

3. if(1 < a < 7) 
   printf("a\n");

이것은 1보다 크고 7보다 작은 조건을 달아보려고 한 것입니다.
a는 3이기 때문에 대입해서 다시 한번 살펴보도록 하겠습니다.
1 < 3 < 7
이게 참일까요 거짓일까요

같은 우선순위의 연산자가 만났을 경우 연산 방향을 확인해야 합니다.
그리고 연산자의 왼쪽이 기준이 됩니다.

 1 < 3 < 7
 └─<─┘
   1─────7
      1        =1   

그래서 조건식이 참이 됩니다. 
그러나 1보다 크고 7보다 작다는 조건식에는 위의 식보다
and 연산자를 이용하는 것이 좋습니다.

if(a > 1 && a <7)
이렇게 쓰시면 됩니다.

4. if('a') 
   printf("a\n");
'a'는 문자입니다.
문자는 곧 아스키코드 값과 연관이 있습니다.
그래서 if(97)과 같은 효과를 가지게 됩니다.
결론은 참

5. if('a'-97) 
   printf("a\n");

이것은 거짓입니다. 4번과 연관되는 내용입니다. a의 10진수 아스키코드는 97입니다.

6. if("안녕하세요") 
   printf("a\n");
문자열이 들어가 있습니다.
이렇게 쓸 일이 없기 때문에 이것에 대한 내용을 모르는 사람이 많을 것 같습니다.
문자열은 배열입니다.
배열은 포인터입니다
포인터는 주솟값을 참조합니다.
주솟값은 숫자로 되어있습니다.
그래서 참입니다.

7. if(1 + 3 = a) 
   printf("a\n");
= 대입 연산자 왼쪽은 변수여야 합니다.
또한 이런 식은 if에서 사용할 수 없습니다.
결론은 오류가 납니다.
if 안의 들어갈 수 있는 식으로 변환을 한다면 if (1 + 3 == a)
이렇게 되어야 오류는 피할 수 있을 것입니다.


if else

 

#include <stdio.h>
int main()
{
	int a = 0;

	if (a>5)
	{
		printf("a>5\n");
	}
	else
	{
		printf("a<=5\n");
	}
	return 0;
}

if 문이 참이 아닐 경우에 실행문을 달 수 있는 구조입니다.

기존의 if 문은 참이 아닐 경우에 실행문을 따로 달 수 없었습니다.

if (a>5)
	{
		printf("a>5\n");
	}
	else(a>5)          //이렇게 조건을 달 수 없습니다.
	{
		printf("a<=5\n");
	}

//----------위와 별개------------------//

else             //if 없이 단독으로 사용이 불가능 합니다.
{
  printf("a\n");          
}

 

중첩 if 문

#include <stdio.h>
int main()
{
	int a = 5;

	if (a > 3)
	{
		if (a < 7)
			printf("3 < a < 7\n");
		else
			printf("a >= 7\n");
	}
	else		
		printf("a <= 3\n");

	return 0;
}

if 문 안에 if 문입니다.
조건을 판단 후 참이면 다시 조건을 판단하는 형태입니다.
처음 조건식에 거짓이 나온다면 가장 아래에 있는 else를 만나게 됩니다.

이렇게 if else if else 가 짝으로 이루어져 있고
어느 것이 짝인지 잘 확인하시기 바랍니다.

이런 식으로 내부에 if 문을 원하는 데로 넣을 수 있습니다. 3개 이상 중첩되는 일은 거의 없지 싶습니다.

if (a > 3) 
{              
               if (a < 7)
이 조건식은 하나로 만들 수 있습니다.

if(a>3 && a <7) 이렇게 말입니다.



else if

#include <stdio.h>
int main()
{
	int a = 0;

	if (a > 5)
	{
		printf("a > 5\n");
	}
	else if (a > 4)
	{
		printf("a > 4\n");
	}
	else if (a > 3)
	{
		printf("a > 3\n");
	}
	else
	{
		printf("a == %d\n", a);
	}
	return 0;
}

else에는 조건식을 못 달지만 else if에는 가능합니다.

이것은 처음의 조건식이 거짓이면
아래의 else if에서 또다시 조건 판단을 하게 됩니다.
또 거짓이면 다시 아래로 가서 조건 판단을 하며
모든 else if 조건이 거짓이라면
마지막 else 안의 내용을 출력합니다.

 

int a = 5;

	if (a > 5)
	{
		printf("a > 5\n");
	}
	if (a > 4)
	{
		printf("a > 4\n");
	}
	if (a > 3)
	{
		printf("a > 3\n");
	}
	else
	{
		printf("a == %d\n", a);
	}

중간의 else if에서 else를 지우면 어떻게 될까요
a 가 5라면
a > 4
a > 3
식이 참이 되므로 두 개 모두 출력이 됩니다.

그리고 마지막 else는 위의 if 문과 짝이 됩니다.
또 단독 else는 삭제를 하더라도 if 문만 있다면 소스 코드 상의 오류는 없습니다.

728x90