C 中 printf 的语法

问题描述 投票:0回答:3

我是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(字符串指针),这种格式与其他两种格式有何不同,没有引号,为什么有字符串,问题可以是愚蠢的,但试着理解我只是一个初学者。

c printf implicit-conversion string-literals
3个回答
2
投票

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

当你写作时

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

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

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

字符串“你好,世界! " 被称为字符串文字。编译器会(自动)将其放置在内存中的某个位置,然后使用该内存地址调用

printf

这是来自 godbolt.org 的示例

enter image description here

左侧有 C 程序,如编辑器中所示。右边是编译好的程序。

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

另请注意,编译器决定使用

puts
而不是
printf
。进一步注意,字符串存储时没有
\n
。原因是
puts
printf
不同,会自动添加
\n


0
投票

对于初学者来说,而不是调用 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', '\0' 
};

表达式中使用的数组会隐式转换(极少数例外)为指向其第一个元素的指针。

所以在这次通话中

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 );

0
投票

其实是同一个图案。 你应该写: printf("%d" ,你想要的变量); “%d”代表您要打印到扫描的整数。

© www.soinside.com 2019 - 2024. All rights reserved.