解释这个嵌套的printf语句

时间:2014-01-06 14:39:10

标签: c printf

int a = 5;

#include <stdio.h>

int main() {
    printf("%d", printf("hi!") * printf("bye"));
    return 0;
}

输出:

hi!bye9

我想知道输出的顺序如何。这是否意味着printf函数返回一个值?

首先执行内部printf语句的原因是什么?

7 个答案:

答案 0 :(得分:6)

该程序展示unspecified behavior,因为除非明确定义,否则未指定子表达式的评估顺序:

printf("%d",printf("hi!")*printf("bye"));
            ^             ^
            1             2

因此,可以先评估1或2,然后您无法确定哪一个。我们可以在C99 draft standard部分6.5 表达式段落 3 中看到这一点(强调我的前进):

  

运算符和操作数的分组由语法表示.74)除非另有说明   稍后(对于函数调用(),&amp;&amp;,||,?:和逗号运算符),子表达式的评估顺序和副作用发生的顺序都未指定

是的,printf确实有一个返回值,即打印的字符数或-1如果有错误,在这种情况下假设没有错误,返回值将为{{1} }对于内部3 s

在调用函数之前计算函数的参数,这就是首先执行内部printf的原因,这在printf 函数调用段中有所介绍 4

  

参数可以是任何对象类型的表达式。 准备拨打电话   函数,参数被评估,并为每个参数赋值   相应的论点.81)

答案 1 :(得分:4)

未指定内部printf的顺序。另一个实现,使用不同编译器设置的相同实现,或者在不同位置使用相同代码的相同实现可能会产生byehi!9

9因为printf返回打印的字符数,所以两个内部printf返回3而*是熟悉的乘法运算符,给出9。

答案 2 :(得分:2)

printf与其他IO函数一样,返回打印的字节数。

这样做可以检查IO是否按预期运行,因为文件/流IO错误可能发生,有时唯一的方法就是检查是否打印了正确的字节数。

答案 3 :(得分:2)

printf返回写入的字节数。所以“嗨!”并且“再见”每人返回3。 3 * 3是9,这就是打印的内容

答案 4 :(得分:1)

printf()返回成功打印的字符数(字节)。请阅读printf()的{​​{3}}。

答案 5 :(得分:1)

得到hi!bye9因为printf返回输出的字节数,如果有错误则返回负数。

来自http://www.cplusplus.com/reference/cstdio/printf/

  

成功时,返回写入的字符总数。   如果发生写入错误,则设置错误指示符(ferror)并返回负数。

所以:

printf("%d",printf("hi!")*printf("bye"));

首先,两个内部printf调用输出hi!后跟bye。然后来自这两个的返回值被解释为类似于下面的(它们相乘并由外部printf输出):

printf("%d", 3 * 3);

答案 6 :(得分:0)

请注意

  1. printf是标准库的函数,大多数库函数都返回某些内容。
  2. 它返回您要在" "内写的内容的长度。
  3. 如果printf函数内部有空格,则会在长度上添加空格。

示例

#include<stdio.h>
void main()
{
     int x;
     x=printf("xyz \n");
     printf("%d",x);
     getch();
}

在这里,第一个printf语句执行,然后返回 首先是printf,它是4。然后我们将此值存储在变量x中并打印该变量。因此输出将是:

xyz
4

此处的值为4,因为我们使用了空格