【发布时间】:2017-05-21 14:42:04
【问题描述】:
不是我的代码,而是来自here。在 read_data() 函数中,有一个 scanf 后面有一些我以前没见过的东西。它有什么作用?是 STL 吗?
scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++;
【问题讨论】:
-
混淆的根源是什么? comma operator?
标签: c++ scanf comma-operator
不是我的代码,而是来自here。在 read_data() 函数中,有一个 scanf 后面有一些我以前没见过的东西。它有什么作用?是 STL 吗?
scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++;
【问题讨论】:
标签: c++ scanf comma-operator
这是逗号运算符的使用。逗号运算符的使用非常少见,它将一堆表达式组合在一起作为一个表达式。在这种情况下,声明
scanf("%d %d\n", &a, &b), G[a].pb(b), deg[b]++;
表示“执行scanf,然后在G[a] 上调用pb(b),然后调用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++ 语言的奇怪细节来弄清楚它的含义。 :-)
【讨论】:
这只是使用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]++;
}
【讨论】: