【问题标题】:Casting variables to the function [duplicate]将变量转换为函数[重复]
【发布时间】:2019-05-08 16:21:39
【问题描述】:

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

【问题讨论】:

  • 你是在问是否可以写foo(a, b)而不写演员表?
  • @M.M - 我把它倒过来了。将int 转换为char 会产生警告。谢谢,已删除评论。
  • @rsjaffe 该问题涉及不同的主题(当您将参数传递给未声明的函数时会发生什么)
  • 总是做显式转换而不是隐式转换。并打开关于隐式警告的编译器警告。

标签: c function variables casting


【解决方案1】:

按照C语言的标准,强制转换的时候 传递给函数在 C 中会自动发生吗?

“转换”是类型转换运算符的应用,其形式为括在括号中的类型名称。这种操作符(如果有的话)的效果是将操作数转换到操作符指定的类型。作为操作员的效果,演员阵容永远不会是自动的。但是,其他一些转换是自动执行的,我想这就是您的意思。

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

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

【讨论】:

    【解决方案2】:

    编译器是否会自动为您进行函数调用的转换将取决于函数调用中使用的变量类型以及函数定义中可用的变量类型,以便编译器做出有关转换的决定。

    如果函数调用中的变量类型是内置类型(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;
    }
    

    【讨论】:

    • 在 C99 及更高版本中,尝试调用未声明的函数是违反约束的。符合标准的编译器至少会发出诊断信息。无论如何都接受此类调用的那些——例如为了与遗留代码的兼容性——对如何处理它们根本没有要求,尽管在实践中它们的行为可能或多或少像这里描述的那样。
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2018-07-20
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多