2010-12-06 6 views
11

나는 을 본 적이 없으며 전에 문을 본 적이 없습니다.C에서 while 루프의 쉼표로 구분 된 표현

while(printf("> "), fgets(str, 100, stdin), !feof(stdin)) { 
.. 
.. 
} 

나는 온라인에서 읽을 때, while 루프에서 나오는 조건이 가장 오른쪽 [! feof (stdin)]이라는 것을 읽었습니다.

또한
while(!feof(stdin)) 
{ 
     printf("> "); 
     fgets(str, 100, stdin); 
     ... 
     ... 
} 

에 반대 문은 식을 취 동안 다음, 위의 동안 문의 사용은 1,1,1 C에서 유효한 식 그래서, 무엇인가?

답변

17

주어진 두 개의 루프는 같은 의미가 아닙니다. 그런 식으로 쉼표 연산자를 사용하여 작성자는 루프 자체가 입력되지 않아도 반복 할 때마다 실행해야하는 코드를 지정할 수있었습니다. do ... while() 루프와 비슷하거나 다음과 같습니다.

printf("> "); 
fgets(str, 100, stdin); 
while(!feof(stdin)) { 
    .. 
    .. 

    printf("> "); 
    fgets(str, 100, stdin); 
} 
4

comma operator은 운영자로서 가장 잘 생각됩니다. +이 연산자이기 때문에 2 + 3은 표현식 (결과적으로 값은 5입니다.)이므로 ,도 연산자이므로 0, 1은 유효한 표현식입니다 (결과적으로 1의 값이됩니다. 이후 마지막 피연산자).

2

제안 된 수정 사항은 동일하지 않습니다. 이다 :

while (1) { 
    printf("> "); 
    fgets(str, 100, stdin); 
    if (feof(stdin)) { break; } 
    ... 
    ... 
} 

내가 대신 함수로 작업을 깨는 제안 :

int get_input(char* buffer, int size) { 
    printf("> "); 
    fgets(buffer, size, stdin); 
    return !feof(stdin); 
} 

while (get_input(str, 100)) { 
    ... 
    ... 
} 
2

두 번째 예는 처음보다 다른 행동을 가지고 있으며, 버그가 있습니다.

코드 줄 경우

:이 파일의 끝에 읽기 때문에

fgets(str, 100, stdin); 

실패는 다음 블록의 나머지 부분은 실행됩니다.

첫 번째 코드 집합에서 fgets() 다음에 feof() 테스트가 발생하므로 EOF 조건이 발생하므로 while() 블록이 실행되지 않습니다.

약간 다른 동작이 여전히
while (fgets(str, 100, stdin)) { 
    printf("> "); 

    // ... 
} 

(가있을 것입니다 : 그것은 EOF를 명중했다 (그리고 버퍼로 데이터를 읽을 수있다)

fgets() 이후 반환 NULL 것처럼, 나는 루프를 코딩 할 수 있습니다 하나 더 적은 ">"인쇄). 그게 중요하다면, 나는 그 루프의 앞에 printf()의 추가 인스턴스를 넣을 것이다.

일반적으로 혼란을 야기하기 때문에 쉼표 연산자가 실제로 필요하거나 혼동을 일으키지 않는 곳을 제외하고는 피할 수 있습니다. 예를 들어, 때로는 각 루프 반복에서 여러 변수를 업데이트 할 수 있도록 혼란스럽지 않게 루프 절을 for에 사용합니다.

+1

실제로 기록와 루프 라인을 처리하지 않고 종료한다은'EOF받지 않고 개행를 수신 종료 fgets'. 이렇게하면 루프가 줄 바꿈에서 끝나지 않는 최종 줄을 무시하게됩니다. 줄 바꿈은 원하는 동작이지만 버그 일 가능성이 있습니다. –

+0

@R : http://www.drpaulcarter.com/cs/common-c-errors.php#4.2에서 관찰 한 내용을 상기시켜줍니다. "저자는 아직 어떤 학생도 feof() 함수를 사용하는 것을 보지 못했습니다. 바르게!" –

1
while(printf("> "), fgets(str, 100, stdin), !feof(stdin)) { 
.. 
.. 
} 

쉼표 동안 더 같이 동작 내부 :

int feof_wrapper(FILE * stream) 
{ 
    printf("> "); 
    fgets(str, 100, stream); 
    return feof(stream); 
} 

while(!feof_wrapper(stdin)) { 
.. 
.. 
} 
관련 문제