我最近了解到printf()返回它要调用的字符数.但我想知道我之前从未"使用过"这个返回值,例如:
int c = printf("Called func\n");
Run Code Online (Sandbox Code Playgroud)
要么
printf("%d", printf("Called func\n"));
Run Code Online (Sandbox Code Playgroud)
我只是写了一些语句,其中执行了printf的功能,如:
printf("Called func\n");
Run Code Online (Sandbox Code Playgroud)
那么printf()的返回值"发生了什么"?编译器如何知道它"ok"不使用返回的整数?
一个表达式语句一样
printf("x=%d\n", x);
Run Code Online (Sandbox Code Playgroud)
类似于
(void) printf("x=%d\n", x);
Run Code Online (Sandbox Code Playgroud)
计算printf给出的值(成功输出的字符数,或出错时为-1),然后丢弃并忽略.
顺便说一下,对于这样的赋值是相同的x=5;:该赋值表达式的值(5)x=5被丢弃并被忽略; 当然它的副作用已经完成,改变了变量位置的值x.如果您编码printf("x=%d\n", (x=5))了该赋值的值将被使用并传递给printf.
一个优化编译器可能(或不)产生略微不同的机器代码(参见如-如果规则,至少对C++).但是C11语言规范(读n1570)用英语定义了程序的可观察行为,即它的语义.
请注意,GCC(以及其他一些编译器,例如Clang)作为扩展提供了使用warn_unused_result function属性声明函数的能力.如果未明确使用该函数的结果,则会收到警告.
请注意,某些编程语言(Ocaml,Scheme,Haskell,....)没有语句,并且所有内容都有表达式,其中一些具有副作用.