解释这个嵌套的printf语句

its*_*cvk 5 c printf

int a = 5;

#include <stdio.h>

int main() {
    printf("%d", printf("hi!") * printf("bye"));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

hi!bye9
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*our 6

该程序表现出未指定的行为,因为除非明确定义,否则未指定子表达式的评估顺序:

printf("%d",printf("hi!")*printf("bye"));
            ^             ^
            1             2
Run Code Online (Sandbox Code Playgroud)

因此,可以首先评估1或2,然后您无法确定哪个.我们可以从C99草案标准部分6.5 表达式3段看到这一点(强调我的未来):

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

是的,printf确实有一个返回值,即打印的字符数或者-1如果有错误,在这种情况下假设没有错误,返回值将同时3用于内部printfs

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

参数可以是任何对象类型的表达式.在准备对函数的调用时,将对参数进行求值,并为每个参数分配相应参数的值.81)


Jac*_*ley 5

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

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

  • 从技术上讲,这是两个词... :) (2认同)