C 中 printf 的语法
Syntax of printf in C
我是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),这种格式和其他两种格式有什么不同,没有quotes 和为什么有 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(即字符串的地址 of/pointer 被加载到 edi),就在调用打印函数之前。
另请注意,编译器决定使用 puts
而不是 printf
。进一步注意字符串存储 而没有 \n
。原因是 puts
不像 printf
自动添加一个 \n
.
对于初学者而不是这个 printf 调用
printf("Hello, World!\n");
你可以使用像
这样的看跌期权调用
puts( "Hello, World!" );
字符串文字"Hello, World!\n"
在内部表示为字符数组,如
char string_literal[] =
{
'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\n', '[=12=]'
};
表达式中使用的数组被隐式转换(极少数例外)为指向其第一个元素的指针。
所以在这次通话中
printf("Hello, World!\n");
用作函数调用参数的字符数组被转换为类型 char *
指向其第一个元素 'H'
的指针。你可以想象一下下面的方式
printf( &"Hello, World!\n"[0] );
因此该函数处理类型为 char *
的指针。你可以通过引入一个中间变量来做同样的事情
char *s = "Hello, World!\n";
printf( s );
或
char *s = "Hello, World!\n";
printf( "%s", s );
或
char *s = "Hello, World!";
printf( "%s\n", s );
或
char *s = "Hello, World!";
puts( s );
我是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),这种格式和其他两种格式有什么不同,没有quotes 和为什么有 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(即字符串的地址 of/pointer 被加载到 edi),就在调用打印函数之前。
另请注意,编译器决定使用 puts
而不是 printf
。进一步注意字符串存储 而没有 \n
。原因是 puts
不像 printf
自动添加一个 \n
.
对于初学者而不是这个 printf 调用
printf("Hello, World!\n");
你可以使用像
这样的看跌期权调用puts( "Hello, World!" );
字符串文字"Hello, World!\n"
在内部表示为字符数组,如
char string_literal[] =
{
'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\n', '[=12=]'
};
表达式中使用的数组被隐式转换(极少数例外)为指向其第一个元素的指针。
所以在这次通话中
printf("Hello, World!\n");
用作函数调用参数的字符数组被转换为类型 char *
指向其第一个元素 'H'
的指针。你可以想象一下下面的方式
printf( &"Hello, World!\n"[0] );
因此该函数处理类型为 char *
的指针。你可以通过引入一个中间变量来做同样的事情
char *s = "Hello, World!\n";
printf( s );
或
char *s = "Hello, World!\n";
printf( "%s", s );
或
char *s = "Hello, World!";
printf( "%s\n", s );
或
char *s = "Hello, World!";
puts( s );