微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C 中 printf 的语法

如何解决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 的示例

enter image description here

左侧是在编辑器中显示的 C 程序。右边是编译好的程序。

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

还要注意编译器决定使用 puts 而不是 printf。进一步注意字符串的存储没有 \n。原因是 putsprintf 不同会自动添加 \n

,

对于初学者而不是调用 printf

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

你可以使用像这样的看跌期权

puts( "Hello,World!" );

字符串字面量 "Hello,World!\n" 在内部表示为字符数组,如

char string_literal[] = 
{ 
    'H','e','l','o',',' ','W','r','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",World!";
puts( s );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。