c - 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 ,这个问题可能很愚蠢,但是试着理解我只是一个初学者。
解决方案
虽然它在您的编辑器中看起来不同,但实际上是相同的。
当你写
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
.
推荐阅读
- r - 使用 plotmath 在指数括号内写上标,例如,类似泊松的乘法方程
- c++ - 使用 cmake 从源代码构建 MySQL 连接器/C++ 失败(与先前的声明冲突)
- select - 选择下一个 1000
- python - Django 错误“home.models.Friend.DoesNotExist:好友匹配查询不存在。”
- java - Spring Boot + Security:无法提供静态页面:不支持请求方法“GET”
- webstorm - 如何在 WebStorm 中关闭区分大小写的完成?
- go - 指针引用未存储在我的 go 程序的结构中
- python - 为什么将 (.|\n)* 更改为 (.| )* 会导致性能大幅下降?
- swift - 为什么在分段控件上使用 UIControlState.normal 会导致此崩溃?
- angular - 如何将服务从 Angular 库注入到另一个 Angular 库