본문 바로가기
📚 STUDY/🔥 C

Q&A (continue, goto, null)

by 엄지잉 2024. 9. 11.

📌 6.1 단원에서 나온 루프 말예요, "> 0" 검사를 빼면 좀 더 루프가 짧아지지 않나요? i가 0이 되면 루프는 멈출거고, 원래 사용했던 루프랑 동일하게 작동하잖아요.

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

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

 

- 간결해보이지만, 몇 가지 단점이 존재함.

① 가독성이 떨어짐. 새 코드를 보면 i가 0이 되면 종료할 거라는 건 알겠지만, i를 통해 숫자를 증가하면서 수를 세고 있는 건지, 감소갛면서 수를 세고 있는 건지 불명확함.

② 새 코드는 만약 i가 루프가 실행될 때, 음수라도 되는 순간 원래 코드에서 의도한 방식대로 작동하지 않음. 원래 코드라면 바로 종료되겠지만, 새 코드는 바로 종료되지 않음.

 

 

📌 6.3 단원을 보니까 대부분의 경우 for문은 while문으로 공식처럼 치환이 될 수 있다고 하셨는데, 그럼 대부분이 아닌 경우는 뭐가 있나요?

// 1
n = 0;
sum = 0;
while (n < 10) {
  scanf("%d", &i);
  if (i == 0) {
    continue;
  }
  sum += i;
  ++n;
}

// 2
sum = 0;
for (n = 0; n < 10; ++n) {
  scanf("%d", &i);
  if (i == 0) {
    continue;
  }
  sum += i;
}

 

- 1을 2(for)로 치환함. 이게 근데 원래 코드랑 같은 코드는 아님.

- i가 0일 때, 원래 코드는 n을 증가시키지 않음. 반면, 새로 짠 코드는 n을 증가시킴.

 

 

📌 while (1)이랑 for(;;) 중에 어떤 게 더 나은 무한루프인가요?

- 보통 C 프로그래머들은 for (;;)을 더 선호함.

- 효율성 때문인데, 옛날 컴파일러들은 while문의 1 조건을 매번 검사하게 했음.

- 요즘 컴파일러들 기준으로 둘 사이에 성능 차이는 없음.

 

 

📌 프로그래머라면 continue문은 절대로 쓰면 안된다고 하던데, 정말인가요?

- 자주 사용하지 않는 건 맞지만, while문에서는 continue문을 나름 쓸만 함. 

- 아래 예시) 입력값을 받는 루프. 입력값을 받았을 때, 유효한 값이면 어떤 처리를 해준다고 가정. 만약, 이 값이 유효한지 아닌지 판별하는 코드가 상당히 복잡하다면 continue문이 상당히 유용함.

for (;;) {
  read data;
  if (data fails first test) {
    continue;
  }
  if (data fails second test) {
    continue;
  }
  .
  .
  .
  if (data fails last test) {
    continue;
  }
  process data;
}

 

 

 

📌 goto문이 도대체 뭐가 안 좋다는 거예요?

- 안 좋다기 보다, goto문보다 더 나은 방법이 있어서 그럼. goto문을 여러 번 사용하면 '스파게티 코드'가 될 것.

- goto문은 코드의 특정 부분이 여러 목적을 수행하게 만들 수 있기 때문에, 수정하기 까다로움.

 

 

📌 null문이 루프의 본문을 비워주는 것 말고는 따른 용도가 없나요?

- 매우 적음. 

- null문은 문법상 여러 군데에서 사용가능하기 때문에, 사용 가능성은 높음. 근데 실무에서는 본문 비우는 거 말고 드물게 발생하는 경우 딱 하나에만 사용함.

- 복합문 마지막에 라벨을 넣어야한다고 하자. 라벨은 혼자서는 사용할 수 없어요. 만드시 뒤에 구문이 따라와야함. 여기에 null문을 넣어주면 이 문제를 해결해줄 수 있음.

ed!{
  …
  goto end_of_stmt;
  …
  end_of_stmt: ;
}

 

 

📌 null문 말고는 빈 루프를 만드는 방법은 없나요?

- continue문을 사용하는 프로그래머들도 있긴 함.

for (d = 2; d < n && n % d != 0; ++d) {
  continue;
}

 

- 빈 복합문을 사용하는 경우도 있음.

for (d = 2; d < n && n % d != 0; ++d) {
}

 

 

 

💡 본 내용은 K.N.King의 C Programming: A Modern Approach 책을 참고하였습니다.

'📚 STUDY > 🔥 C' 카테고리의 다른 글

[6-5] null문  (1) 2024.09.11
[6-4] 루프에서 벗어나기  (1) 2024.09.11
[6-3] for문  (1) 2024.09.05
[6-2] do문  (0) 2024.09.05
[6-1] while  (0) 2024.09.05