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

Lov*_*ing 0 c

我最近了解到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"不使用返回的整数?

Bas*_*tch 5

一个表达式语句一样

 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,....)没有语句,并且所有内容都有表达式,其中一些具有副作用.

  • @Truth-seek:你可以做`y =(x = 5)+ 1;`这会把`y`设置为`6`. (3认同)