Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回过程是否根据C标准将所需的类型强制转换/转换为结果,还是仅在某些实现中受支持?_C - Fatal编程技术网

返回过程是否根据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文件,但没有足够快地找到它。