【问题标题】:Explain C code snippet: preprocessor + printf =?解释 C 代码片段:预处理器 + printf =?
【发布时间】:2010-09-04 07:06:44
【问题描述】:

此代码 sn-p 的输出是 %s is a string is a string。请解释一下。

#include <stdio.h>

#define scanf "%s is a string"

int main()
{
    printf(scanf, scanf);  
}

【问题讨论】:

    标签: c printf c-preprocessor


    【解决方案1】:

    您究竟想让我们解释什么?代入宏得到

    printf("%s is a string", "%s is a string");
    

    其余的是printf的预期正常日常行为。

    附: #define scanf ...???

    【讨论】:

    • 为什么输出'%s is a string is a string'?
    • @Vish:因为printf 就是这样工作的,printf 就是这样工作的。当你在你最喜欢的 C 书籍或文档中阅读printf 的描述时,有什么不明白的地方吗?
    • @Vish:这样想吧。 printf() 调用的格式字符串是 "%s is a string"。有一个"%s" 格式,因此它采用相应的参数并将其替换为字符串。第一个参数是字符串"%s is a string"。把它们放在一起,"[%s is a string] is a string" 被打印出来了(为了强调而添加了括号)。
    • 这是一个经典的“use-mention”区分:en.wikipedia.org/wiki/Use%E2%80%93mention_distinction“%s is a string”本身就是一个字符串,但也可以在printf中使用语句,因为它具有字符串插值指令。 '%s' 是模板中的一个“洞”,你可以用你想要的任何字符串来填充它。然后,您将使用自己“填充”它(因为它是一个字符串)!
    【解决方案2】:

    预处理器进行盲替换以给出:

    printf("%s is a string","%s is a string");
    

    第一个参数中的%s 是字符串的格式说明符,并替换为第二个参数。第二个参数中的 %s 没有什么特别之处。

    【讨论】:

      【解决方案3】:

      这是一些相当奇怪的代码,但输出将是“%s is a string is a string”,因为在这两种情况下 scanf 都被扩展为“%s is a string”,然后 printf 将其替换为 %s .

      【讨论】:

        【解决方案4】:

        printf("%s 是字符串","%s 是字符串");

        我猜想混淆是 printf 将如何处理第二个 %s。 要清除这一点, printf 不是递归函数。如果您正在打印一个字符串并且该字符串具有任何格式标识符,则它不被视为格式标识符。它被认为是纯字符串。所以在这种情况下,第二个“%s is a string”只是一个普通字符串。此字符串中的 %s 不是格式标识符。

        如果你有类似 printf("%s %s is a string", "%s %s is a string"); 那么是的,你会得到运行时错误,说 printf 缺少一些参数。

        【讨论】:

          【解决方案5】:

          要理解这段代码,请一一运行以下语句:-

          printf("%s is a string","StRiNG");
          printf("%s %s is a string","StRiNG");
          printf("%s is a string","StRiNG","Hey");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-23
            • 2018-06-11
            • 2013-04-06
            • 1970-01-01
            • 2012-10-24
            相关资源
            最近更新 更多