首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C编译器在传递给函数时会自动将文本转换为参数类型吗?

C编译器在传递给函数时会自动将文本转换为参数类型吗?
EN

Stack Overflow用户
提问于 2022-07-10 10:31:28
回答 1查看 85关注 0票数 0

我对C中类型的转换有疑问。如果不显式转换,是否可以将文字传递给函数参数(期望不同类型但兼容类型)?例如,这里有一个示例代码:

代码语言:javascript
复制
#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;
}

代码运行良好,但我想知道这是否合法或是否会导致未定义的行为(假设没有溢出)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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),就会发生这种情况。

默认的参数提升包括整数提升(与低级别的intint相比,整数类型在很大程度上比技术上更窄)和将float提升到double

请注意,这些转换的适用函数类型是用于调用函数的表达式的类型。一个函数可以用一个原型(比如int foo(char *a) { ... } )在一个地方定义,但是可以在另一个没有原型的地方(例如int foo(); )声明。函数调用中可见的声明决定将执行哪些转换。当通过指针调用函数时,情况尤其如此。

请注意,这些转换不是强制转换。强制转换是源代码中的特定运算符,是括号中的类型名称,对其执行转换。转换(如源代码中的(int) )与操作不同,就像源代码中的+与为其执行的添加不同一样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72927791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档