본문 바로가기

programming language/C 언어

if문 이해

 if문에서 if블록에 해당되는(if문에 영향을 받는)문장은 어디까지인가?

 

<해결해야 할 예시>

#include<stdio.h>
int main(void)
{
	int a;
	int sum = 0;
	int i = 1;
	scanf("%d", &a);

	for (i = 1; ; i++) {
		sum += i;
		if (sum >= a)
		printf("%d", i); break;
	}
	return 0;
}

위 코드는 a값이 1이하이면, 정상적으로 출력이 되지만 1을 초과한 수가입력이 되게 되면, 정상적으로 출력이 되지않는다.  if (sum >= a) printf("%d", i);  break; 의 문장에서 if블록 내에 속하는 문장은 printf문 뿐이다. break문은 if문내에 속하지 않는다. 그래서 조건이 성립되지 않으면, 값을 출력하지 못하고 break문을 만나버리니 의도한대로 출력값을 얻지 못하는 것이다. 한마디로 if문에 관계없이 break가 될 운명이라는 것이다. 그렇다면, 이를 해결하기 위해 어떻게 해야 할까? 밑의 두코드가 그 예시이다.


<해결1>

#include<stdio.h>
int main(void)
{
	int a;
	int sum = 0;
	int i = 1;
	scanf("%d", &a);

	for (i = 1; ; i++) {
		sum += i;
		if (sum >= a)
		 break;
	}
	printf("%d", i);
	return 0;
}

if문의 블록내에 break문이 있다. 그러므로 조건 sum이 a이상이면 break이고,

sum이 a값 이상이 될때 까지 for문에 의해 반복이 된다.

그래서 첫번째 코드와 달리 어떤수를 입력하더라도 값이 출력이 되는것이다.(ex 3을 입력하면 2가 출력된다.)


<해결2>

#include<stdio.h>
		int main(void)
	{
		int a;
		int sum = 0;
		int i = 1;
		scanf("%d", &a);

		for (i = 1; ; i++) {
			sum += i;
			if (sum >= a)
			{
				printf("%d", i); break;
			}
		}
		return 0;
	}

첫번째 코드와 매우 유사한 것을 볼 수 있을 것이다. 차이점은 무엇일까? if문에 중괄호를 통해 if블록내에 break문을 포함시켜 줌으로써 내가 생각한 대로 결과값을 얻을 수 있게 되었다. if문도 for문이나 기타 반복문처럼 바로 밑의 한줄은 그 조건문에 포함되는 블록으로 보지만, 그 문장이 끝난뒤( ; ), 그 다음 문장부터는 그 반복문이나 조건문에 종속되지 않은 것으로 간주하므로 이런 조건문이나 반복문을 사용하여 줄때, 자기가 블록내에 포함하고자 하는 문장들은 중괄호를 사용해 포함 되게끔 지정해 주어야 한다.