C语言:我不明白它为什么有效
有人知道当需要C语言:我不明白它为什么有效,c,C,有人知道当需要int时返回char时会发生什么吗 char testunc1(char a) { return a; } void main() { int x1; x1 = testfunc1(7); printf("%d\n",x1); } char被隐式转换为int 在C99标准第6.5.16.1节第2段中: 在简单赋值(=)中,右操作数的值转换为 赋值表达式,并替换存储在由左 操作数 赋值表达式的类型在第6.5.16节第3段中定义: 赋值表达式的类型
int
时返回char
时会发生什么吗
char testunc1(char a)
{
return a;
}
void main()
{
int x1;
x1 = testfunc1(7);
printf("%d\n",x1);
}
char
被隐式转换为int
在C99标准第6.5.16.1节第2段中:
在简单赋值(=
)中,右操作数的值转换为
赋值表达式,并替换存储在由左
操作数
赋值表达式的类型在第6.5.16节第3段中定义:
赋值表达式的类型是左操作数的类型,除非
左操作数具有限定类型,在这种情况下,它是类型的非限定版本
左操作数
由于变量类型为int
,因此返回的char
值将转换为C99标准第6.5.16.1节规定的int
类型
在这种情况下,值
7
可以完全由int
表示,因此,当7
存储在int
变量中时,不会发生精度损失。C中的所有算术类型之间存在隐式转换。因此,这里int
值7
在传递到testunc1
函数时隐式转换为char
。当testfunc1
返回值分配给x1
(将char
返回值转换为int
)时也是如此。当调用int
函数时,隐式转换为char
。由于char
最多可以拟合127个值,因此这种方法可以很好地工作。稍后,从函数返回的结果被回溯到int
,当然,这同样适用于int
适合所有可以适合char
的值。您将得到答案为7。在testfunc1中,int将被转换为char,在main函数中,char将被提升回int,如果您想打印字符,请使用printf(“%c\n”,x1);由于变量的类型为int,返回的字符值将升级为int类型,紧跟在类型之后,testfunc1
到x1
的赋值中没有整数升级。赋值运算符的右操作数被转换为左操作数的类型,这里从char
转换为int
,但这不是6.3.1.1
整数升级的一部分。@啊,是的,我相信你是正确的<代码>6.3.1.1在计算表达式时包括整数提升,而不是赋值的结果类型。我将更新答案,以引用标准中有关转换为左操作数类型的正确部分。