int a = 5;
#include <stdio.h>
int main() {
printf("%d", printf("hi!") * printf("bye"));
return 0;
}
输出:
hi!bye9
我想知道输出的顺序如何。这是否意味着printf
函数返回一个值?
首先执行内部printf
语句的原因是什么?
答案 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)
请注意
printf
是标准库的函数,大多数库函数都返回某些内容。" "
内写的内容的长度。printf
函数内部有空格,则会在长度上添加空格。示例
#include<stdio.h>
void main()
{
int x;
x=printf("xyz \n");
printf("%d",x);
getch();
}
在这里,第一个printf
语句执行,然后返回
首先是printf
,它是4。然后我们将此值存储在变量x
中并打印该变量。因此输出将是:
xyz
4
此处的值为4,因为我们使用了空格