不是我的代码,而是来自here。在read_data()函数中有一个scanf,后面还有我之前看不到的东西。它有什么作用?这是STL吗?
scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++;
答案 0 :(得分:7)
这是逗号运算符的用法。逗号运算符非常罕见地使用,将一堆表达式作为单个表达式排列在一起。在这种情况下,声明
scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++;
表示“执行scanf
,然后在pb(b)
上致电G[a]
,然后致电deg[b]++
,评估deg[b]++
的结果。
我看到它在这种情况下使用:
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]++;
}
上面的代码在功能上是等同的,并且更具可读性 - 您不必发布到Stack Overflow或了解C ++语言的奇怪细节以弄清楚它的含义。 : - )
答案 1 :(得分: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]++;
}