代码之家  ›  专栏  ›  技术社区  ›  Miguel Andrés Rendón Reyes

为什么使用print(“%s”,“string”)而不仅仅是print(“string””)?[副本]

c
  •  0
  • Miguel Andrés Rendón Reyes  · 技术社区  · 8 月前

    我最近读了很多C代码。

    我发现人们有时会使用: printf("%s", "string") 而不是仅仅 printf("string") 具有以下特点 "string" 它是静态的,不是来自输入。

    这对性能有影响吗,还是只是代码美学?这是一种坏习惯还是好习惯?

    2 回复  |  直到 8 月前
        1
  •  5
  •   Eric Postpischil    8 月前

    这个 f 在里面 printf 用于格式化: 输出函数 在写入输出时正在工作。使用 printf("string") 至少引发了两个问题:

    • 输出函数 必须考虑字符串的每个字符,看看它是否包含 % 表示格式化指令的字符。如果字符串很长,这是很多不必要的工作。相比之下 printf("%s", "string") , 输出函数 只需检查 %s ,查看它是否指示打印一个字符串,然后将字符串写入输出,而不检查除指示其结束的空字符之外的任何内容。
    • 你的 "string" 示例可以仅仅是占位符。通常,我们希望写入缓冲区或其他数据存储中的字符串,这些字符串通常不是常量,而是包含来自用户或其他来源的字符。在这种情况下,我们不能仅仅将字符串传递给 输出函数 要打印,因为如果它包含格式化指令, 输出函数 将解释这些指令,而不仅仅是打印字符串。

    如果我们只想将字符串写入标准输出,可以通过以下方式完成 fwrite(string, length, 1, stdout) fputs(string, stdout) 当我们已经知道长度时,前者更可取,因为它不需要被调用的例程再次检查数据以找到空终止符。

        2
  •  -2
  •   extinctsion    8 月前

    简而言之:

    printf("%s", "string") 是编写打印语句的更好方法,因为对什么性质变量没有歧义 string 它使编译器清楚地知道变量的数据类型。虽然编译器必须为以下内容分配空间 %s 这是一个分散的过程,可能比直接使用 printf("string") 声明。

    演出

    这两种类型的性能差异可以忽略不计。此外,这是个人在简单之间的选择( printf(“string”) )以及可读性( printf(“%s”,“string”) )