본문 바로가기

프로그래밍 언어/C

[K.N.K C Programming 정리] Chap 6. Loops

K.N.KING C Programming

안녕하세요 여러분!

오늘 포스팅은 조금 짧습니다 하하. 처음 알았던거나 헷갈렸던 부분 위주로 적었어요!

자 그럼 드가봅시다!


Chap6. Loops

A program without a loop and a structured variable isn't worth writing.


6.1 The while statement

while문의 형태는 다음과 같다. 

 

while  (  expression  )  statement

 

소괄호안의 표현식은, 제어식 이라고 부른다.(controlling expression) 소괄호 바깥의 문장은 loop body 이다.

while문이 실행되면, 먼저 expression 이 0이 아닌값을 가지면(true 인 상황) 바디가 실행된다. 그 후 다시 표현식이 true면 바디가 실행된다. 이렇게 expression 이 0인 값을 가질때까지(false) 반복된다.

statement는 단 하나여야 한다. (헷갈리면 이전 포스팅 내용중 compound statement 를 보고오자!)

이런 코드가 있다고 해보자.

i = 10;
while(i > 0) {
	printf("T minus %d and counting\n", i);
    i--;
}

여기서 한가지 짚고 넘어갈것은, 저 controlling expression 은 루프가 종료됬을때 항상 거짓이다! 따라서, while문이 종료되고 나서 i값은 항상 0보다 작거나 같아야 한다.(그렇지 않은 경우 계속 루프가 실행되고 있겠지? 그렇지?)

 

6.3 The for statement

for문의 형식은 다음과 같다. 

 

for  (  expr1  ; expr2;  expr3  ) statement

 

이때 for문은 while문과 정확히 일치하게 쓸 수 있는데, 이를테면 다음과 같다.

 

expr1;

while  (  expr2  )  {

    statement

    expr3;

}

 

이렇게 말이다.

여기서 첫번째 표현식 expr1과 세 번째 표현식 expr3는 구문(statements)로서 작용한다. 즉, 이 값들은 전혀 상관이 없다.

즉, 그들은 오직 부가 효과 때문에 의미가 있다.(they're useful only for their side effects.)

(이게 무슨말이냐면, C언어에서 표현식(expressions)은 값을 가진다. 예를 들면 i + 1; 처럼 말이다. 그런데 표현식이 

i = 1; 이나 i++; 과 같은 표현식이라면 부가 효과(side effect - 대입연산자의 경우 i값에 1을 저장함. 증감연산자의 경우 i값을 fetch하고 1증가시키고 다시 i값에 1증가된값을 저장)를 가지게 되므로, 의미가 생긴단 말이다.) 

또한, for문은 규칙성있게 증가하거나 감소하는 상황의 반복문에서 유용하다. 

for문의 세 표현식은 모두 생략 가능하다.

 

 

The comma operator

가끔씩 우리는 for문을 사용할때 두개의 변수를 초기화하고 싶거나 혹은 한번의 반복에서 여러 변수의 값을 증가시키고 싶은 상황에 직면한다. 우리는 콤마연산자를 사용해 이런 상황을 해결할 수 있다.

콤마연산자는 다음과 같은 형태를 지닌다.

 

expr1  ,  expr2 

 

콤마식(comma expression)은 두가지 step으로 평가(evaluated)된다. 

먼저, expr1이 평가되고 그 값이 버려진다. 두번째로, expr2 가 평가된다. 그리고 expr2의 값이 콤마식의 결과값이다. 

expr1을 평가하는것은 반드시 부가 효과(side effect)를 가져야 한다. 만약 가지지 않는다면, epxr1은 아무 쓸모가 없다!

예를 들면, 

 

++i, i + j 가 평가되는 경우. 

 

i값이 1 증가하고 바뀐 i값이 j와 더해질것이다.

콤마연산자의 우선순위는 모든 연산자보다 낮은 우선순위를 가진다. 또한 left - associative(결합법칙) 이므로, 우리는

 

i = 1, j = 2, k = i + j; 이 문장을

 

( (i = 1),  (j  =  2) ),  (k  =  (i +  j) )

 

이렇게 바꿀 수 있다. 콤마의 왼쪽 표현식이 오른쪽 표현식보다 먼저 평가되기 때문에 

i = 1 j = 2 그리고 k = i + j 순서로 실행된다.

콤마 연산자는 C에서 하나의 표현식이 필요한데 두개 이상의 표현식을 작성하고 싶을때 이용된다.

바꿔말하면, 콤마연산자는 두개의 표현식을 하나의 표현식으로 붙여준다("glue")!

(복합문(compound statement)과 역할이 비슷함을 짚고 넘어가자!)

 

사실 이걸 쓸 상황이 그렇게 빈번하게 일어나지는 않는데, 아마 macro 에서 사용하는걸 제외하면 for문이 유일한 사용처일것이다. for문에서의 사용 예시를 살펴보면 다음과 같다. 

 

sum = 0;
for (i = 1; i < N; i++)
	sum += i;

 

이렇게 쓰는 대신,

 

for(sum = 0, i = 1; i < N; i++)
	sum += i;

 

이렇게 쓸 수 있다. sum에 먼저 0값이 할당되고 i 에 1이 할당된다. 콤마를 이용해 여러개의 변수를 초기화 할 수 있다.


여러분 오늘은 진짜 짧죠?

for(expr; expr; expr); 이런식으로 쓰는거나 goto 문에 관한 내용도 담고 싶었는데 사실 Kn king 선생님도 goto문을 별로 추천안한다는 뉘앙스로 설명하셔서 그냥 뺐습니다 ㅋㅋㅋ;;;(The goto statement is rarely needed in everyday C programming. Programs that use more than a few goto statements can quickly degenerate into "spaghetti code.) 그 이유로, break와 continue 문은 무조건 앞쪽으로만 점프하는 반면, goto문은 뒤로도 갈 수도있고, 앞으로도 갈 수도 있다는 점을 들었습니다. (goto statements make programs hard to read because they can jump either forward or backward. In contrast, break and continue only jump forward.)

 

읽어주셔서 감사합니다 여러분!

그럼 모두 안녕히~