函数原型和参数强制

时间:2014-04-21 00:27:17

标签: c++ function-prototypes

来自我的C ++教科书

  

函数原型的一个重要特征是参数强制    - 即,强制参数到参数声明指定的适当类型。例如,程序可以调用函数   一个整数参数,即使函数原型指定了一个   双参数 - 函数仍然可以正常工作。

所以我试过了

#include <iostream>

// void foo(double);

void foo(double a) {

   std::cout << sizeof(a) << std::endl;
}

int main (void){

   int a = 1;
   std::cout << sizeof(a) << std::endl;
   foo(a);

   return 0;
}

并且使用或没有原型,然后首先正确打印4 (内部功能)8。

我的编译器是否在没有的情况下检查函数定义 原型(可能不是严格的C ++标准,但是 也有用)或者我错过了什么?

4 个答案:

答案 0 :(得分:2)

一切都应该在这里。考虑使用sizeof电话输出的内容。您正在输出变量的大小。现在您需要了解的是,当您将a传递给函数foo时,a会隐式转换为doubledoubleint具有相同的值,但它们是不同的类型。 int的大小为4个字节,double的大小为8个字节。

基本上,当教科书说编译器会强制参数声明指定的相应类型时,你的教科书意味着它会查看你的int a并找到它的双重性(它会两种情况都是4)。编译器执行此操作是因为它看到函数foo需要doublefoo获得int。它不会更改主函数中a的类型。 a中的main始终为inta函数中的foo始终为double

请参阅:http://en.cppreference.com/w/cpp/language/implicit_cast 有关隐式转换的更多信息。

答案 1 :(得分:1)

这里实际发生的是编译器意识到foo接受double参数,并将int参数转换为double。输出显示double在此特定系统中为8个字节,int为4个字节 - 两者都非常普通。请注意,a中的fooa中的main不同。它们是不同的东西,即使它们被称为相同的东西。

答案 2 :(得分:1)

函数foo实例化一个新的临时值,也恰好被称为a,使用你传递给它的int类型为double。然后,您正在打印此新临时双精度的大小。大小为8,因为在您的平台上,双倍是8。

答案 3 :(得分:1)

教科书幻灯片的下一张幻灯片清楚地说明了您的编译器正在做什么。签出:
有时,参数值与 函数原型中的参数类型可以由 在调用函数之前将编译器编译为正确的类型。
这些转换按照C ++的升级规则进行。
促销规则说明如何在不使用类型的情况下进行转换 丢失数据。
可以将int转换为double而不更改其值。
但是,将double转换为int会截断小数 double值的一部分。
请记住,双精度变量可以容纳很多 比int变量大,因此可能会丢失数据 相当。