我对C中类型的转换有疑问。如果不显式转换,是否可以将文字传递给函数参数(期望不同类型但兼容类型)?例如,这里有一个示例代码:
#include<stdio.h>
int sum(int a, int b){
return a + b ;
}
int main(void){
int x = sum(6U,5U) ; /* Does the compiler automatically casts unsigned to int?
or do I need to explicitly cast it sum( (int) 6U, (int) 5U) ?*/
printf("%d \n", x);
return 0;
}代码运行良好,但我想知道这是否合法或是否会导致未定义的行为(假设没有溢出)?
发布于 2022-07-10 10:41:21
如果函数调用中的参数对应于具有声明类型的参数,则该参数将转换为参数类型,根据C 2018 6.5.2.2 7。
如果参数与声明类型的参数不对应,则执行默认参数提升。当参数对应于函数原型的...部分时(按照C 2018 6.5.2.2 7 ),或者当被调用的函数没有原型时( 6.5.2.2 6),就会发生这种情况。
默认的参数提升包括整数提升(与低级别的int到int相比,整数类型在很大程度上比技术上更窄)和将float提升到double。
请注意,这些转换的适用函数类型是用于调用函数的表达式的类型。一个函数可以用一个原型(比如int foo(char *a) { ... } )在一个地方定义,但是可以在另一个没有原型的地方(例如int foo(); )声明。函数调用中可见的声明决定将执行哪些转换。当通过指针调用函数时,情况尤其如此。
请注意,这些转换不是强制转换。强制转换是源代码中的特定运算符,是括号中的类型名称,对其执行转换。转换(如源代码中的(int) )与操作不同,就像源代码中的+与为其执行的添加不同一样。
https://stackoverflow.com/questions/72927791
复制相似问题