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_o​​perator)? –

答えて

7

これはカンマ演算子の使用です。カンマ演算子は、まれにしか使用されておらず、一連の式をまとめて単一の式としてまとめています。 。

:この場合は、声明

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

は「deg[b]++の結果を評価し、deg[b]++を呼び出し、G[a]pb(b)を呼び出す

私はそれは、この文脈で使われていることがわかり、その後、scanfを行う意味します

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

正直なところ、これは貧しいスタイルとして私を打つことは、この書き込みをする方がよいでしょう:。

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

上記のコードは、機能的には同等であり、読みやすくなっています。つまり、C++言語の詳細を知るためにスタックオーバーフローや奇妙な詳細を知る必要はありません。 :-)

3

それは(それがコードを難読化として、私の意見で良いアイデアではありません)forループ周りにカッコを回避するのに役立つcomma operator. を使用することにより、単一の文の中に作られただけで複数の式です。

それが機能的に同等です:

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