首页 > 解决方案 > C中printf的语法

问题描述

我是C初学者,我主要使用以下两种格式的printf

#include <stdio.h>

//Compiler version gcc  6.3.0

int main()
{
  int c=5;
  printf("Hello, World!\n");
  printf("%d",c);
  return 0;
}

但是最近我发现还有另一种写 printf 的方法,即printf(string pointer),这种格式与其他两种格式有何不同,没有引号,为什么有 string ,这个问题可能很愚蠢,但是试着理解我只是一个初学者。

标签: cprintfimplicit-conversionstring-literals

解决方案


虽然它在您的编辑器中看起来不同,但实际上是相同的。

当你写

printf("Hello, World!\n");

在您的编辑器中,您的编译器原则上将其更改为

char* hidden_unnamed_string = "Hello, World!\n";
printf(hidden_unnamed_string);

字符串 "Hello, World!\n" 称为字符串文字。编译器将(自动)将其放置在内存中的某个位置,然后printf使用该内存地址进行调用。

这是 godbolt.org 的一个例子

在此处输入图像描述

在左侧,您可以看到 C 程序在编辑器中的样子。在右侧,您有已编译的程序。

注意字符串是如何位于代码块之外并用 LC0 标记的。然后在调用打印函数之前,将代码块 LC0 内部加载到 edi 中(即,将字符串的地址/指针加载到 edi 中)。

另请注意,编译器决定使用puts而不是printf. 进一步注意,字符串存储时没有\n. 原因是puts不像printf自动添加一个\n.


推荐阅读