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语句首先被执行的原因是什么?
该程序表现出未指定的行为,因为除非明确定义,否则未指定子表达式的评估顺序:
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)
内部printfs的顺序未指定。另一种实现,具有不同编译器设置的相同实现,或者在不同位置具有相同代码的相同实现可能会产生byehi!9.
9 来了是因为printf返回打印的字符数,所以两个内部printfs 返回 3 并且*是熟悉的乘法运算符,给出 9。