返回流程是否根据C标准转换/转换结果所需的类型,或者仅在某些实现中支持?

j r*_*riv 4 c

我注意到了

float f; 
[..]
printf("%i\n", f);
Run Code Online (Sandbox Code Playgroud)

不合理

printf("%i\n", (int)f);
Run Code Online (Sandbox Code Playgroud)

但是也

int func(float f) {
    return f;
}
Run Code Online (Sandbox Code Playgroud)

没问题

printf("%i\n", func(f));
Run Code Online (Sandbox Code Playgroud)

是由返回流程或标准支持的功能完成的转换/转换,还是理想的需要

int func(float f) {
    return (int) f;
}
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 5

转换是标准的.ISO C99标准的相关部分见6.8.6.4节第3段:

如果表达式的类型与其出现的函数的返回类型不同,则通过赋值给具有函数返回类型的对象来转换该值.

所以它被隐式转换,就像它在这个赋值中一样:

float f = 3.0f;
int i;

i = f;
Run Code Online (Sandbox Code Playgroud)

允许的转化次数为:

  • 返回类型具有限定或非限定算术类型,表达式具有算术类型;
  • 返回类型具有与表达式类型兼容的结构或联合类型的限定或非限定版本;
  • 返回类型和表达式都是兼容类型的限定或非限定版本的指针,返回类型具有表达式类型的所有限定符;
  • 返回类型或表达式之一是指向对象或不完整类型的指针,另一个是指向限定或非限定版本的指针void,返回类型具有表达式类型的所有限定符;
  • 返回类型是一个指针,表达式是一个空指针常量; 要么
  • 返回类型具有类型_Bool,表达式是指针.

(你的榜样相匹配的第一个-无论是intfloat是算术型)