【问题标题】:What happens to the return value of printf()? [duplicate]printf() 的返回值会发生什么变化? [复制]
【发布时间】:2018-01-01 13:22:18
【问题描述】:

我最近了解到 printf() 返回它被调用打印的字符数。但我想知道我以前从未“使用”过这个返回值,比如:

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

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

我只是写了执行 printf 功能的语句,例如:

printf("Called func\n");

那么 printf() 的返回值发生了什么?编译器如何知道它“可以”不使用返回的整数?

【问题讨论】:

  • 编译器如何知道它的“ok”不使用返回的整数?”你通过编码printf( ...);告诉它。
  • @alk 为什么编译器不抛出错误,因为我“错误地”调用了函数?
  • 从形式语言的角度来看,调用一个函数并忽略它“返回”的值并没有错,它评估为。请参阅下面的Basile's answer
  • 任何简单的表达式都是有效的语句。调用具有返回值的函数是一个表达式。就像写5;(strcmp); 一样,编译器可能会发出一些关于没有副作用或类似的表达式的警告,但忽略任何表达式是完全可以的。

标签: c


【解决方案1】:

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_resultfunction attribute 声明函数的能力。如果未明确使用该函数的结果,您将收到警告。

请注意,有些编程语言(Ocaml、Scheme、Haskell ......)没有语句,所有东西都有一个表达式,其中一些有副作用。

【讨论】:

  • 为什么说x=5;这个语句的值(5)被丢弃忽略了呢?存储在内存位置的值 (5) 不是打算成为变量x 吗?它是如何丢弃的?对不起,如果这是一个愚蠢的问题。
  • 是存储的,5是x=5表达式的值,其重要的副作用是改变变量x位置内的值
  • @Truth-seek:你可以完成y = (x = 5) + 1;,这会将y 设置为6
  • @alk 谢谢。他们教我的地方忽略了很多洞察力
猜你喜欢
  • 2013-07-02
  • 2012-10-23
  • 2013-11-12
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多