printf()的返回值会发生什么变化?

时间:2018-01-01 13:22:19

标签: c

我最近了解到printf()返回它要调用的字符数。但我想知道我从未使用过"之前的这个返回值,如:

int c = printf("Called func\n");

printf("%d", printf("Called func\n"));

我只是写了一些声明,其中执行了printf的功能,如:

printf("Called func\n");

那么"发生了什么"到printf()的返回值?编译器如何知道它的" ok"不使用返回的整数?

1 个答案:

答案 0 :(得分:5)

expression-statement喜欢

 printf("x=%d\n", x);

类似于

(void) printf("x=%d\n", x);

计算printf给出的值(成功输出的字符数,或出错时为-1),然后丢弃并忽略。

顺便说一句,对于像x=5;这样的赋值,它是相同的:该赋值表达式x=5的值(5)被丢弃并被忽略;当然,它的副作用是改变变量x的位置值。如果您编码printf("x=%d\n", (x=5)),则会使用该作业的值并将其传递给printf

optimizing compiler可能(或不会)生成略有不同的machine code(请参阅as-if rule,至少对于C ++而言)。但C11语言规范(阅读n1570)用英语定义了程序的可观察行为,即semantics

请注意,GCC(以及其他一些编译器,例如Clang)作为扩展提供了使用warn_unused_result function attribute声明函数的功能。如果未明确使用该函数的结果,您将收到警告。

请注意,某些编程语言(Ocaml,Scheme,Haskell,....)没有语句,而且所有内容都有表达式,其中一些有副作用。