【问题标题】:How does "[*(p++) / 52]" in "putchar(" .-+#"[*(p++) / 52]);" work?"putchar(" .-+#"[*(p++) / 52]);" 中的 "[*(p++) / 52]" 如何工作?
【发布时间】:2021-08-24 15:15:25
【问题描述】:

每当我查找“putchar()”函数时,我似乎都找不到关于标题中的表达式如何工作的来源。这来自用于过滤/解码的 FFMPEG API 示例。

这里是源链接:https://ffmpeg.org/doxygen/trunk/filtering__video_8c.html

第 203 - 212 行

    puts("\033c");
    for (y = 0; y < frame->height; y++) {
        p = p0;
        for (x = 0; x < frame->width; x++)
            putchar(" .-+#"[*(p++) / 52]);
        putchar('\n');
        p0 += frame->linesize[0];
    }

【问题讨论】:

  • putchar() 只打印通过其参数传递的值。如果您无法弄清楚参数,那么这与putchar() 或函数调用无关。

标签: arrays c string


【解决方案1】:

" .-+#" 是 6 个字符的字符串字面量(最后一个为空字符);使用" .-+#"[index],您将获得其中一个字符,只要index 介于05 之间。

索引的计算方式基于*p 的当前值,并对其应用52 的整数除法。因此,如果*p 介于 0 和 51 之间,则会打印一个空格;如果 *p 介于 52 和 103 之间,则将打印 .,依此类推。 ++ 增加 p(指向 *p 的值)以进行下一次迭代(因此在数组中向前)并且不影响当前表达式。

所以,如果p0 指向一个数组,比如[43, 78, 173, 145, 215],那么打印出来的字符串就是 .+-#

【讨论】:

    【解决方案2】:

    您看到的是数组访问与数组定义相结合。 " .-+#" 是一个字符串文字,即char[][*(p++) / 52] 部分正在对该数组进行索引,以访问位于 *(p++) / 52 位置的字符串文字的元素。

    总而言之," .-+#"[*(p++) / 52] 将解析为字符串 " .-+#" 中的单个字符

    【讨论】:

      【解决方案3】:

      putchar 的参数:

      " .-+#"[*(p++) / 52]
      

      字符串常量" .-+#" 是否应用了数组下标。所以表达式*(p++) / 52 显然计算为一个介于 0 和 4 之间的值,用于选择要打印的字符串常量中的字符之一。

      【讨论】:

      • 当然,如果他们真的很邪恶,他们会写成(*p++ / 52)[" .-+#"]。 :-)
      猜你喜欢
      • 2015-08-20
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多