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

C printf()的返回值会发生什么变化?,c,C,我最近了解到printf()返回它被调用打印的字符数。但我想知道我以前从未“使用”过这个返回值,比如: int c = printf("Called func\n"); 或 我只是写了一些语句,其中printf的函数是这样执行的: printf("Called func\n"); 那么printf()的返回值“发生了什么事”?编译器如何知道其“确定”不使用返回的整数 类似于 (void) printf("x=%d\n", x); 计算由给定的值(成功输出的字符数,或错误时为-1),然后丢弃

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

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

我只是写了一些语句,其中printf的函数是这样执行的:

printf("Called func\n");
那么printf()的返回值“发生了什么事”?编译器如何知道其“确定”不使用返回的整数

类似于

(void) printf("x=%d\n", x);
计算由给定的值(成功输出的字符数,或错误时为-1),然后丢弃并忽略

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

可能(或不可能)生成稍有不同的(请参阅,至少对于C++)。但是语言规范(read)用英语定义了程序的可观察行为,即它的行为

请注意(以及其他一些编译器,例如)作为扩展提供了使用
warn\u unused\u结果声明函数的功能。如果未显式使用该函数的结果,则会收到警告

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

类似于

(void) printf("x=%d\n", x);
计算由给定的值(成功输出的字符数,或错误时为-1),然后丢弃并忽略

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

可能(或不可能)生成稍有不同的(请参阅,至少对于C++)。但是语言规范(read)用英语定义了程序的可观察行为,即它的行为

请注意(以及其他一些编译器,例如)作为扩展提供了使用
warn\u unused\u结果声明函数的功能。如果未显式使用该函数的结果,则会收到警告


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

“编译器如何知道它“确定”不使用返回的整数?”您通过编写
printf(…)
@alk为什么编译器不抛出错误,因为我“错误地”调用了函数?从形式语言的角度来看,调用函数并忽略它“返回”的值并没有错,它的计算结果是。请看下面。任何简单的表达式都是有效的语句。使用返回值调用函数是一个表达式。就像写
5一样
(strcmp)编译器可能会发出一些关于没有SideEffect或类似内容的表达式的警告,但忽略任何表达式完全可以。“编译器如何知道其“确定”不使用返回的整数?”您通过编写
printf(…)
@alk为什么编译器不抛出错误,因为我“错误地”调用了函数?从形式语言的角度来看,调用函数并忽略它“返回”的值并没有错,它的计算结果是。请看下面。任何简单的表达式都是有效的语句。使用返回值调用函数是一个表达式。就像写
5一样
(strcmp)编译器可能会发出一些关于没有SideEffect或类似内容的表达式的警告,但是忽略任何表达式是完全可以的是否被丢弃并忽略?存储在内存位置的值(5)不是要作为变量
x
?它是如何被丢弃的?如果这是一个愚蠢的问题,很抱歉。它是存储的,5是
x=5
表达式的值,其重要的副作用是更改变量
x
@Truth seek的位置内的值:您可以执行
y=(x=5)+1
它会将
y
设置为
6
@alk谢谢。在他们教给我的地方,那么多的洞察力被忽略了,为什么你说语句
x=5的值(5)是否被丢弃并忽略?存储在内存位置的值(5)不是要作为变量
x
?它是如何被丢弃的?如果这是一个愚蠢的问题,很抱歉。它是存储的,5是
x=5
表达式的值,其重要的副作用是更改变量
x
@Truth seek的位置内的值:您可以执行
y=(x=5)+1
它会将
y
设置为
6
@alk谢谢。他们教我的地方忽略了这么多的洞察力
(void) printf("x=%d\n", x);