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在计算表达式时包括整数提升,而不是赋值的结果类型。我将更新答案,以引用标准中有关转换为左操作数类型的正确部分。