2016-06-15 6 views
0

은 왜왜`while ((ch = getchar())! = EOF)`가 일반적인 관용구입니까?

while ((ch = getchar()) != EOF) { 
    // stuff 
} 

일반적인/선호/다음보다 더 나은 생각?

ch = getchar(); 
while (ch != EOF) { 
    // stuff 
    ch = getchar(); 
} 

나는 몇 가지 이유를 생각할 수 있습니다.

경우 :

  • 짧은.
  • 모든 것이 조건으로 이루어집니다.
  • 루프 전에 조건을 다시 작성하고 루프의 끝에 을 잊지 않을 수 있습니다.

    • 혼란 : 반대

    .

  • 루프 내에서의 할당입니다 (혼란 스러울까요?).
  • 루프의 조건에서 잠재적으로 초기화되지 않은 변수입니다 ( 이 할당되었지만 즉시 명확하지 않을 수 있음).
  • 두 번째 형식으로 "한 줄, 한 작업"사고 방식을 유지하면서 비교 및 ​​할당이 깔끔하게 분리되어 유지됩니다.
  • 모든 할당에 대해 하나의 비교가 있으므로 두 경우 모두 의 복잡도가 동일하므로 이해하기 쉬운 양식 을 선호해야합니다.

비슷한 구조가 사용 된 다른 예가 있습니까?

나는이 질문이 의견을 이끌어 낼 것이라는 느낌이 들기 때문에 나는 일종의 이유와 함께 뒷받침 해달라고 요청할 것이다. 간단한 검색 결과이 질문과 중복되지 않았으므로 중복되지 않았 으면합니다.

+1

더 좋은 방법은 'for (ch = getchar(); ch! = EOF; ch = getchar())입니다. – Nishant

+0

(ch = getchar(); ch! = EOF; ch = getchar()) 두 번째 경우 대신 EDIT : ^^ 단어를 내 입에서 꺼 냈습니다 –

+6

대체 양식을 사용하지 않는 이유는 [DRY 원칙] 때문입니다 (https://en.wikipedia.org/ wiki/Don % 27t_repeat_yourself). 이것은 또한 오늘날 인기있는 'for'루프 솔루션에도 적용됩니다. – user3386109

답변

0

코드는 정액 코드 K & R C에 나와 있기 때문에 일반적으로 표시됩니다.

내 개인적인 취향이 그런 식으로, 또는이 중 reading k&r(c book) and confusing 1st chapter code됩니다 :

for (int ch = getchar(); ch != EOF; ch = getchar()) 

또는이 :

for (int ch; (ch = getchar()) != EOF;) 

있습니다 당신이 바로 여기에 혼란 초보자 프로그래머의 예를 볼 수 있습니다 고양이를 가죽으로 만드는 많은 방법. 하지만 K & R이 먼저 껍질을 벗 겼습니다.

+0

왜 그들이 그 특별한 형태를 제안했는지 알고 있습니까? 아마도 그것은 메모리 제약으로 인한 것이었고 가능한 코드의 간결성을 원했습니다. – jamesh625

+4

'while ((ch = getchar())! = EOF)'는 getchar() 매크로 폼을 두 번 확장하지 않고 한 번만 확장합니다. 바람직하다. –

+0

@ jamesh625 K & R 서적이 쓰여졌을 때 작성자는 훌륭한 프로그래밍 연습과 읽을 수있는 코드를 만드는 것에 대해 단 한 가지를 모르기 때문에. 적절한 프로그램 설계 및 판독 가능한 코드에 대한 업계의 사실상의 표준은 아직 확정되지 않았습니다. 이 책은 70 년대 중반에 쓰여졌 고, 고대이고 완전히 구식입니다. – Lundin