从我的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 ++标准,但也很有用)或者我错过了什么?
一切都应该在这里。考虑使用sizeof
调用输出的内容。您正在输出变量的大小。现在您需要了解的是当您将a
传递给函数foo
时,a
被隐式转换为double
。 double
与int
具有相同的值,但它们是不同的类型。 int
的大小为4个字节,double
的大小为8个字节。
基本上,当教科书说编译器会强制参数声明指定的相应类型时,你的教科书意味着它会查看你的int a
并找到它的双重性(在两种情况下都是4)。编译器这样做是因为它看到函数foo
需要double
但foo
正在获得int
。它不会改变主函数中a
的类型。在a
的main
总是一个int
和a
在你的foo
功能总是一个double
。
有关隐式转换的更多信息,请参阅:http://en.cppreference.com/w/cpp/language/implicit_cast。
这里实际发生的是编译器意识到foo
采用double
参数,并将int
参数转换为double
。输出显示double
在这个特定系统中是8个字节,而int
是4个字节 - 两者都很普通。请注意,a
中的foo
与a
中的main
不同。它们是不同的东西,即使它们被称为相同的东西。
函数foo
实例化一个新的临时值,也恰好被称为a
,使用传递给它的int
为double类型。然后,您正在打印此新临时双精度的大小。大小为8,因为在您的平台上,双倍是8。
教科书幻灯片中的下一张幻灯片清楚地解释了您的编辑器正在做什么。看看这个: 有时,在调用函数之前,编译器可以将与函数原型中的参数类型不完全对应的参数值转换为正确的类型。 这些转换按照C ++的促销规则的规定进行。 促销规则指示如何在不丢失数据的情况下转换类型。 可以将int转换为double而不更改其值。 但是,转换为int的double会截断double值的小数部分。 请记住,双变量可以包含比int变量更大的数量,因此数据丢失可能相当大。