【问题标题】:Commas after a scanf statement? [duplicate]scanf 语句后的逗号? [复制]
【发布时间】:2017-05-21 14:42:04
【问题描述】:

不是我的代码,而是来自here。在 read_data() 函数中,有一个 scanf 后面有一些我以前没见过的东西。它有什么作用?是 STL 吗?

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

【问题讨论】:

标签: c++ scanf comma-operator


【解决方案1】:

这是逗号运算符的使用。逗号运算符的使用非常少见,它将一堆表达式组合在一起作为一个表达式。在这种情况下,声明

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++ 语言的奇怪细节来弄清楚它的含义。 :-)

【讨论】:

    【解决方案2】:

    这只是使用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]++;
       }
    

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 2023-03-08
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2010-10-25
      • 2013-09-08
      相关资源
      最近更新 更多