扫描声明后的逗号?

时间:2017-01-06 18:55:42

标签: c++ scanf comma-operator

不是我的代码,而是来自here。在read_data()函数中有一个scanf,后面还有我之前看不到的东西。它有什么作用?这是STL吗?

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

2 个答案:

答案 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]++;
   }