C 将变量强制转换为函数

C 将变量强制转换为函数,c,function,variables,casting,C,Function,Variables,Casting,根据C语言的标准,传递到函数时的转换是否会在C语言中自动发生?例如,我们可以给chara,b类型的foo(inta,intb)值,或者我们应该这样做:foo((int)a,(int)b).编译器是否会自动完成函数调用时的强制转换,这取决于函数调用中使用的变量类型以及函数定义中可用的变量类型,以便编译器做出强制转换的决定 如果函数调用中的变量类型是内置类型(int、long、float等),并且实际函数接口的声明可用,C编译器将做出智能自动转换决策 如果函数声明可用,C编译器还能够根据函数定义检查

根据C语言的标准,传递到函数时的转换是否会在C语言中自动发生?例如,我们可以给chara,b类型的foo(inta,intb)值,或者我们应该这样做:foo((int)a,(int)b).

编译器是否会自动完成函数调用时的强制转换,这取决于函数调用中使用的变量类型以及函数定义中可用的变量类型,以便编译器做出强制转换的决定

如果函数调用中的变量类型是内置类型(int、long、float等),并且实际函数接口的声明可用,C编译器将做出智能自动转换决策

如果函数声明可用,C编译器还能够根据函数定义检查函数调用中使用的变量类型。如果编译器检测到问题,它将根据发现的问题发出警告或错误

如果函数接口,函数定义中使用的参数,如果C编译器在执行函数调用的位置不可用,则C编译器无法根据函数定义检查所使用的变量类型,也无法正确地自动转换变量类型以符合实际函数定义

但是,如果没有函数声明,C编译器将假定函数的第一次使用是正确的,并将根据第一次使用自动为您生成函数声明

C标准中有关于C编译器在执行自动强制转换时将执行的操作的规则。因此,如果函数声明是针对
int
的,并且您在函数调用中提供了
char
,那么C编译器将自动为您转换为
int

还有一些默认的、遗留的规则,这些规则在C标准中是关于函数使用时的假设的,并且C编译器没有用于检查函数使用情况的函数声明

函数声明类似于:

int func1 (int a, int b);   // declare the interface for function func1().
int func1 (int a, int b)
{
    if (a < 50) a = 0;
    return a + b;
}
函数定义包含函数实现的实际代码,类似于:

int func1 (int a, int b);   // declare the interface for function func1().
int func1 (int a, int b)
{
    if (a < 50) a = 0;
    return a + b;
}
int func1(int a,int b)
{
如果(a<50)a=0;
返回a+b;
}
根据C语言的标准,在 传递给函数在C语言中自动发生

“Casting”是typecast运算符的应用程序,其形式为括号中的类型名。这种运算符(如果有)的效果是将操作数转换为运算符指定的类型。作为一名操作员的作用,演员阵容从来都不是自动的。然而,其他一些转换是自动执行的,我想这就是你的意思

例如,我们可以吗 给出char a、b类型的foo(int a、int b)值,或者我们应该这样做: foo((int)a,(int)b)


您可以使用强制转换将变量转换为函数参数的类型,但在许多情况下,包括您的示例情况,不需要这样做。如果函数具有范围内原型,并且参数表达式满足相应函数参数的要求,则参数表达式将自动转换为参数类型。特别是,如果函数参数具有任何算术类型(与指针、数组、结构或联合类型相反),则可以使用相同或任何其他算术类型的参数表达式,而无需强制转换。

您是否询问是否可以编写
foo(a,b)
而无需编写强制转换?@M.M-我将其反转。将
int
转换为
char
将生成警告。谢谢,您已经删除了注释。@rsjaffe该问题涉及不同的主题(当您将参数传递给未声明的函数时会发生什么情况),请始终执行显式强制转换,而不是隐式强制转换。在C99及更高版本中,试图调用未声明的函数是违反约束的。符合要求的编译器至少会发出诊断信息。不管怎样,那些接受这种调用的人——例如为了与遗留代码兼容——对于如何处理它们根本没有任何要求,尽管在实践中,它们的行为可能或多或少与这里描述的一样。