C 如何使用printf()打印函数的返回值? 更新:

C 如何使用printf()打印函数的返回值? 更新:,c,printf,C,Printf,原始代码看起来很像这样: // printf(printf();); #include <string> int main() { printf(printf("Hello, WORLD!");); } 我们看到了结果: Hello, World! x has 14 characters. 当我预料到: x has 14 characters. //because this appears first. Hello, World! //because

原始代码看起来很像这样:

// printf(printf(););

#include <string>

int main()
{
   printf(printf("Hello, WORLD!"););
}
我们看到了结果:

Hello, World!
x has 14 characters.
当我预料到:

x has 14 characters.  //because this appears first.
Hello, World!         //because this appear second.
因为
x
x之后,有14个字符。

有人请解释一下为什么
/a.out
会按倒序给我结果(在Ubuntu中使用gcc和shell);此外,eclipse显示了以相同的向后顺序给出结果


也许另一种重新表述问题的方式是:世界你好!\n“被叫去打印吗?
世界你好首先显示,因为您先打印了它


首先(在第4行),按如下方式调用
printf
printf(“你好,世界!\n”)
。它打印
你好,世界和换行符。将调用返回的值(
14
,打印的字符数)保存在
x

然后(在第5行)调用
printf
,如下所示:
printf(“x有%d个字符。\n”,x)
。它打印的
x有14个字符。
和一个换行符。返回的值将被丢弃


请注意,
x
没有字符;它有一个号码。具体来说,它具有第一次调用
printf
返回的数字,即它打印的字符数

下面给出了您想要的输出:

const char* msg = "Hello, World!";
size_t len = strlen(msg);
printf("msg has %zu characters.\n", len);
printf("%s\n", msg);

您试图使用
printf
获取字符串的长度,但它也会在返回打印字符长度时打印出给定的字符串。这不是你想要的

您可以使用
strlen
而不是
printf
获取字符串的长度,而无需将其打印到输出

char *str = "Hello, World!\n";
int x = strlen(str);
printf("x has %d characters.\n", x);
printf(str);
return 0;
当您调用时,它将打印您作为参数传递的任何字符串。 所以,您在控制台上获得的打印结果与您在代码中放置它们的顺序相同

从OP编辑后更新:

我仍然不太明白你所说的
//是什么意思,因为这是第二个出现的。
在那里评论

x has 14 characters.  //because this appears first.
Hello, World!         //because this appear second.
我对这个问题的理解是,您要做的是解释为什么首先打印
Hello World
,然后打印
x有14个字符。
正在打印

我不能用最简单的话来解释这一点,“因为,当代码被执行时,处理器第一次遇到对
printf()
函数的调用,该函数带有一个字符串参数
“Hello World\n”
。所以它会在控制台上转储它。 然后是第二个调用
printf(“x有%d个字符。\n”,x);
,最终在控制台上转储该字符。”

显然,
x
的值是
14
,因为字符串中的字符数
Hello World为13+1(即14)

现在是混乱: 如果您认为您刚刚将
x
定义为
printf(“Hello World!\n”)
,那么这是一个错误的假设。
使用
intx=printf(“你好,世界!\n”)语句,实际上,您声明了一个
int
变量
x
,并用
return
ed
printf(“Hello World\n”)初始化(或赋值)它,即
14

考虑一下这个小程序:

#include <stdio.h>

int foo(int bar)
{
  printf("Foo %d\n", bar);
  return 42;
}

int main() {
  int x = foo(12);           // we call the foo function which prints "Foo 12"
                             // the return value of foo is assigned to x"
  printf("Hello World.\n");  // we print "Hello World"
  printf("x = %d\n", x);     // we print "x = 42"
}
如果你理解这个小程序,你也应该理解你的程序的输出

在您的程序中:

#include <stdio.h>
int main(int argc, char ** argv)
{
    int x = printf("Hello, World!\n");   // you call printf which prints ("Hello World!") 
                                         // and the return value of printf is assigned to x

    printf("x has %d characters.\n", x); // then we print "x has 14 characters"

    return 0;
}

因为您首先调用了x=printf(“你好,世界!\n”); 系统将在输出中执行printf,并指定x=14


因此,您有了第二个printf。

为什么希望
你好,世界第一个???内容按打印顺序显示。
printf(“a”、“b”、“c”)
不会返回
abc
。我没能理解你的问题
将打印
a
并返回1.Re“where is
”Hello,World\n“
被调用打印?”,第4行(
printf(“你好,世界!\n”)
)@ikegami
printf(“你好,世界!\n”)
被分配给x。没有意义的是说它“被调用以打印”。这就像说在
5*(6+7)
中没有添加,因为添加看起来像
6+7
printf(…)
是对
printf
的调用(就像
6+7
执行添加一样),和
printf
在调用时打印到stdout并返回打印的字节数(就像6+7执行加法并返回13)。您请求了我们的帮助,因此请停止对此提出异议。@Wolfpack'08调用
x=printf(…
printf完全相同(…
,但在后一种情况下,我们只是忽略
printf
的返回值,而在第一种情况下,我们也将
printf
的返回值指定给x。也许你应该阅读C教科书中关于函数的章节。@Wolfpack'08对这个问题的所有评论和回答都是有意义的。我从很久以前,我第一次学习C是通过阅读我的C教科书中有关函数的章节。不,“我只把它定义为x”是没有意义的。
\include
defined
printf
,和
intx
defined
x
。我同意这一点,而且许多开发人员确实不会忍受我说的语气编译器不会执行您的代码,而是编译它",但这是显而易见的技术事实。我不担心问题是否被编辑,只要在我写答案时问题就在那里。此外,如果我建议编辑从原始帖子中删除与编译器相关的语句,因为它们在技术上是错误的,评论家会拒绝它,因为这将是一个错误尝试更改帖子的原始技术细节,无论是对是错。在你的情况下不是这样,但它们通常反映了提问者的总体理解。这是有意义的。
x
Foo 12
Hello World.
x = 42
#include <stdio.h>
int main(int argc, char ** argv)
{
    int x = printf("Hello, World!\n");   // you call printf which prints ("Hello World!") 
                                         // and the return value of printf is assigned to x

    printf("x has %d characters.\n", x); // then we print "x has 14 characters"

    return 0;
}
Hello, World!
x has 14 characters.