函数原型和参数强制

问题描述 投票:1回答:4

从我的C ++教科书

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

所以我试过了

#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 ++标准,但也很有用)或者我错过了什么?

c++ function-prototypes
4个回答
2
投票

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

基本上,当教科书说编译器会强制参数声明指定的相应类型时,你的教科书意味着它会查看你的int a并找到它的双重性(在两种情况下都是4)。编译器这样做是因为它看到函数foo需要doublefoo正在获得int。它不会改变主函数中a的类型。在amain总是一个inta在你的foo功能总是一个double

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


1
投票

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


1
投票

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


1
投票

教科书幻灯片中的下一张幻灯片清楚地解释了您的编辑器正在做什么。看看这个: 有时,在调用函数之前,编译器可以将与函数原型中的参数类型不完全对应的参数值转换为正确的类型。 这些转换按照C ++的促销规则的规定进行。 促销规则指示如何在不丢失数据的情况下转换类型。 可以将int转换为double而不更改其值。 但是,转换为int的double会截断double值的小数部分。 请记住,双变量可以包含比int变量更大的数量,因此数据丢失可能相当大。

© www.soinside.com 2019 - 2024. All rights reserved.