来自我的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 ++标准,但是 也有用)或者我错过了什么?
答案 0 :(得分:2)
一切都应该在这里。考虑使用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 有关隐式转换的更多信息。
答案 1 :(得分:1)
这里实际发生的是编译器意识到foo
接受double
参数,并将int
参数转换为double
。输出显示double
在此特定系统中为8个字节,int
为4个字节 - 两者都非常普通。请注意,a
中的foo
与a
中的main
不同。它们是不同的东西,即使它们被称为相同的东西。
答案 2 :(得分:1)
函数foo
实例化一个新的临时值,也恰好被称为a
,使用你传递给它的int
类型为double。然后,您正在打印此新临时双精度的大小。大小为8,因为在您的平台上,双倍是8。
答案 3 :(得分:1)
教科书幻灯片的下一张幻灯片清楚地说明了您的编译器正在做什么。签出:
有时,参数值与
函数原型中的参数类型可以由
在调用函数之前将编译器编译为正确的类型。
这些转换按照C ++的升级规则进行。
促销规则说明如何在不使用类型的情况下进行转换
丢失数据。
可以将int转换为double而不更改其值。
但是,将double转换为int会截断小数
double值的一部分。
请记住,双精度变量可以容纳很多
比int变量大,因此可能会丢失数据
相当。