【问题标题】:How do I explain the output of this simple C code?如何解释这个简单的 C 代码的输出?
【发布时间】:2016-11-15 20:17:51
【问题描述】:
#include<stdio.h>
int main()
{
int i=10;
printf("%d",printf("%d",i));
return(0);
}

Turbo C 中的输出

102

我是初学者。那么你能解释一下这段代码是如何工作的吗?

【问题讨论】:

  • printf 的手册页对它的返回值有什么说明? Please RTM.
  • 如果您插入newline,它可能会更清晰。 printf("\n%d",printf("%d",i));

标签: c printf


【解决方案1】:

printf 的文档声明它将返回一个整数,表示写入输出流的字符数。

这意味着您可以在对printf 的另一个调用中使用printf 的返回值来满足%d 格式说明符,并且第二个(外部)调用将打印出第一个调用中写入的字符数.

i等于10,所以第一次调用printf输出数字10并返回2(字符串"10"中的字符数),传递给第二个调用printf,它打印2,给你最终输出102

【讨论】:

  • @Ricky 不客气;一旦您对您的问题找到满意的答案,您可以通过单击投票图标下的复选框将其标记为已接受。
【解决方案2】:

让我们分解产生输出的顶级语句:

printf("%d",printf("%d",i));
  • 我们在顶层有一个函数调用printf,将两个参数传递给函数
  • 顶级printf的第一个参数是格式字符串"%d"
  • 顶层printf的第二个参数是调用printf("%d",i)的结果

顶级printf的参数,即printf("%d",i),需要在调用之前进行评估。表达式有一个值和一个副作用。副作用是将"10"打印到输出,值为打印的字符数,即2

由于在进行调用之前对参数进行了评估,因此首先调用printf("%d",i),产生输出10。现在调用顶级printf,并生成输出2,完成您看到的"102" 序列。

【讨论】:

    【解决方案3】:

    printf() 是一个 C 函数。它返回一个等于它打印的字节数的 int 值。

    在您的情况下,INNER printf 打印了“10”,因此它写入了 2 个字节并将返回 2。

    因此,OUTER printf 将打印“2”。

    最终结果:“102”(INNER 的“10”后面跟着 OUTER 的“2”)。

    【讨论】:

      【解决方案4】:

      引用C11,第 7.21.6.1 章

      fprintf 函数返回传输的字符数,或负值 如果发生输出或编码错误。

      在您的情况下,内部printf() 调用是外部printf() 的参数,因此将按照函数参数评估规则执行内部函数调用。

      因此,在您的情况下,首先执行内部printf(),打印i 的值,即10(2 个字符),printf() 调用的返回值用作参数外部printf() 中的%d 格式说明符,打印2

      由于没有视觉分隔符,您会看到彼此相邻的输出,显示为102

      【讨论】:

      • 但是为什么输出:102 ??
      猜你喜欢
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2015-06-26
      • 2021-10-06
      相关资源
      最近更新 更多