【问题标题】:Type conversion during function call in c [duplicate]c中函数调用期间的类型转换[重复]
【发布时间】:2013-07-01 21:19:20
【问题描述】:

我正在阅读 K & R 的书 The C programming Language 来学习 c。它说

由于函数调用的参数是表达式,所以类型转换 当参数传递给函数时也会发生。在里面 没有函数原型,char和short变成int,float 变成双倍。

过去几天我一直在努力理解这条线。我认为这是很重要的一点。无论我在做什么假设,它都不会成为现实。谁能帮我理解清楚?

【问题讨论】:

  • 你做了什么假设?
  • 我删除了 c++ 标签,因为这没有 C++ 关系,因为 C 和 C++ 是不同的语言。
  • 关于 C 函数原型的相关问题的答案中有很好的信息:stackoverflow.com/questions/2575153/…
  • 你不应该在范围内没有原型的情况下编写 C 代码,所以这句话应该无关紧要。但是,如果你坚持要写逆行代码,你需要知道,如果你将一个charshort 变量传递给一个范围内没有原型的函数,C 会自动将值转换为int,并将转换float 值为double。因此,如果没有原型,somefunc(3.0F) 将通过 doublesomefunc();等

标签: c function arguments type-conversion


【解决方案1】:

在 ANSI C 之前,通常有没有原型的函数。在这种情况下,只发生了默认类型的提升。

当有原型时,每个参数表达式都被转换为函数期望的类型,就好像有一个强制转换:

// Declaration
void callMe(char x, int y);
...
// Call
callMe(50, 'x');

上面的调用相当于调用

callMe((char)50, (int)'x');

这很重要,因为调用者和被调用者之间在传递参数方面存在隐式协议:传递参数的方式以及参数的内存占用量取决于类型。如果调用者没有以正确的格式将参数放入内存中,则被调用者将无法正确使用参数。这就是为什么两者必须以某种方式就每个参数的类型达成一致。该标准说“协议”以函数原型的形式出现。如果原型缺失,标准提供“默认协议”,即charshort 变为intfloat 变为double

【讨论】:

  • 请注意,对于 printf() 等可变参数函数,默认类型提升仍然适用。
  • 普通?在标准 C 之前,不可能有原型!
  • 只是为了确认我从你的回答中理解的内容。如果我没有声明函数原型,那么函数会将其参数作为callMe((int)50, (int)'x')
  • @noufal 是的,这是正确的。
【解决方案2】:

这里的关键是“在没有函数原型的情况下”,这不是通常的情况。您会看到这种转换的最常见的地方是在变量参数列表中到像printf 这样的函数。

【讨论】:

  • 另一种情况是处理使用 K&R 风格函数定义的古老代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2013-02-13
相关资源
最近更新 更多