返回过程是否根据C标准将所需的类型强制转换/转换为结果,还是仅在某些实现中受支持?
我注意到返回过程是否根据C标准将所需的类型强制转换/转换为结果,还是仅在某些实现中受支持?,c,C,我注意到 float f; [..] printf("%i\n", f); 这是不合理的 但是 是 而且 int func(float f) { return f; } 穿上合适吗 printf("%i\n", func(f)); 转换/转换是由返回流程或标准支持的功能完成的,还是理想情况下需要 int func(float f) { return (int) f; } ?转换是标准的。ISO C99标准的相关部分见第6.8.6.4节第3段: 如果表达式的类型不同 从函
float f;
[..]
printf("%i\n", f);
这是不合理的
但是
是
而且
int func(float f) {
return f;
}
穿上合适吗
printf("%i\n", func(f));
转换/转换是由返回流程或标准支持的功能完成的,还是理想情况下需要
int func(float f) {
return (int) f;
}
?转换是标准的。ISO C99标准的相关部分见第6.8.6.4节第3段: 如果表达式的类型不同 从函数的返回类型 在其中,该值为 像通过赋值一样转换为 对象的返回类型为 功能 因此它被隐式转换,与此赋值中的转换方式相同:
float f = 3.0f;
int i;
i = f;
允许的转换为:
- 返回类型具有限定或非限定的算术类型,表达式具有 算术类型李>
- 返回类型具有结构或联合类型的限定或非限定版本 与表达式的类型兼容李>
- 返回类型和表达式都是指向兼容类型的限定或非限定版本的指针,并且返回类型具有表达式类型的所有限定符李>
- 一个返回类型或表达式是指向对象或不完整类型的指针,另一个是指向
的限定或非限定版本的指针,并且返回类型具有表达式类型的所有限定符李>void
- 返回类型为指针,表达式为空指针常量;或
- 返回类型的类型为
,表达式为指针\u Bool
(您的示例与第一个匹配—
int
和float
都是算术类型)通常,当表达式具有特定的数值类型,并且其上下文需要不同的数值类型时,会自动进行相应的转换。这适用于以下情况:
void f(float);
void g(long);
int i = 3;
f(i); /*function call, with a prototype in scope*/
g(i); /*ditto*/
double d = i; /*assignment*/
这一原则也适用于表达式return
指令
此原则不适用于可变函数,如printf
。原因是正确的转换取决于格式字符串,编译器不需要分析格式字符串;事实上,如果格式不是字符串文字,编译器通常无法对其进行分析。因此,在下面的printf
调用中,所有类型转换都是必需的:
int i = 3;
float f = 1.5;
printf("%ld %f %d\n", (long)i, (double)i, (int)f);
char c = 'a';
float f = 1.5;
printf("%c %d %f", c, c, f);
但是,由于升级(char
和short
升级为int
,float
升级为double
),并且%c
需要int
,因此在以下printf
调用中不需要强制转换:
int i = 3;
float f = 1.5;
printf("%ld %f %d\n", (long)i, (double)i, (int)f);
char c = 'a';
float f = 1.5;
printf("%c %d %f", c, c, f);
非常感谢你这么做;我正在搜索pdf文件,但没有足够快地找到它。