2017-01-06 6 views
1

내 코드가 아니지만 here에서. read_data() 함수에는 이전에 보지 못했던 무언가가있는 scanf가 있습니다. 그것은 무엇을합니까? 그것은 STL입니까?scanf 명령문 이후의 쉼표?

scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++; 
+2

혼란의 원인은 무엇입니까? [쉼표 연산자] (https://en.wikipedia.org/wiki/Comma_operator)? –

답변

7

쉼표 연산자를 사용합니다. 매우 드물게 사용되는 쉼표 연산자는 일련의 표현식을 하나의 표현식으로 함께 나열합니다. 이 경우,

scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++; 

는 의미 성명에서 "를 scanf을 다음 deg[b]++의 결과를 평가, deg[b]++를 호출 한 후, G[a]pb(b) 전화

를 내가이 상황에서 사용되는 것을 참조하십시오.

를 솔직히
for(i = 1; i <= M; i++) 
    scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++; 

이 나에게 가난한 스타일 파업이 작성하는 더 나은 다음과 같습니다.

,536을
for(i = 1; i <= M; i++) { 
    scanf("%d %d\n", &a, &b); 
    G[a].pb(b); 
    deg[b]++; 
} 

위의 코드는 기능면에서 동등하고 훨씬 더 읽기 쉽습니다. 스택 오버플로에 게시하거나 C++ 언어의 이상한 세부 사항을 알아야 의미를 알 수 있습니다. :-)

3

그것은 하나의 문장으로 만들어 단지 여러 표현의 comma operator. 를 사용하여 (이것은 코드를 난독으로 하지 내 의견으로는 좋은 생각 임) for 루프 주위에 괄호을 방지하는 데 도움이됩니다.

그것은 동일한 기능입니다 :

for(i = 1; i <= M; i++) { 
     scanf("%d %d\n", &a, &b); 
     G[a].push_back(b); /* after macro expansion */ 
     deg[b]++; 
    }