liverpool99   6년 전

11718은 풀었는데 11719는 도저히 못 풀어서 구글 검색후 베껴 제출했네요 ㅠㅠ


코드를 보니까 for(;~scanf("%c,&w) ;) 부분이 있던데

scanf에 ~(not)이 붙어서 

입력이 없을때 까지 라는 뜻인가요???

for문을 이렇게 쓰는 경우는 처음봐서 

제 추측이 맞는 건지 알고 싶습니다.

gallopsys   6년 전

먼저 for문을 왜 저렇게 쓸 수 있는지부터 말씀드리도록 하겠습니다.

일반적으로 C/C++에서 for-loop는 for (초기화; 조건문; 증감연산) { ... }의 형식을 사용하는데, 좀 더 저차원적인(Assembly Lang.) 단계로 파고 들어가보면 for, while, do ~ while, if, switch와 같은 분기/반복문은 결국 조건 점프 구조를 가진다는 사실을 알 수 있습니다.

결론을 말하면 초기화나 증감연산은 "부가적인(Additional)" 요소지, 필수적인 요소가 아니라는 거지요. C, C++을 비롯한 모든 언어에서 Loop의 조건은 사용자가 결정하는 구조를 띄므로, 다른 건 몰라도 조건문만 있으면 컴퓨터의 입장에선 Loop의 끝을 대략이나마 추측할 수 있겠죠. 설령 그게 무한 반복을 돌더라도 말입니다.


C 레퍼런스를 보시면 scanf의 함수 원형과 return value에 대한 정의가 다음과 같이 서술되어 있습니다.

int scanf( const char *format, ... );

On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.

If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof or ferror). And, if either happens before any data could be successfully read, EOF is returned.

If an encoding error happens interpreting wide characters, the function sets errno to EILSEQ.


해석해보시면 알 수 있듯이, End-of-File(입력의 끝)에 다다르면 EOF(-1)을 반환한다는 사실을 알 수 있습니다. 4바이트 int 기준으로 -1을 16진수로 나타내면 0xFFFFFFFF로 이를 Negate Operator(~)로 연산하게 되면 0x00000000... 즉, 0이 됩니다.

C/C++에서는 0, false, (void *)0과 같이 값이 Zero인 경우 이외의 모든 값은 참으로 간주됩니다. 따라서 ~scanf("%c", &w)의 경우에는 입력의 끝에 다다르게 되면 ~(-1) == 0이라는 계산 결과가 나오게 됩니다.. 그렇게 되면 반복문을 빠져나가게 될 것이고, 무사히 프로그램이 종료되겠죠!


설명이 어렵지 않았다면 좋겠네요...

댓글을 작성하려면 로그인해야 합니다.