函数原型和参数强制
Function prototypes and argument coercion
来自我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++标准,但也很有用(还是我错过了什么?
一切都在这里。考虑一下您在sizeof
呼叫中输出的内容。您正在输出变量的大小。现在你要明白的是,当你把a
传递给你的函数foo
时,a
被隐式转换为double
。double
与int
具有相同的值,但它们是不同的类型。在体系结构上,int
的大小为 4 个字节,double
的大小为 8 个字节。
基本上,当你的教科书说编译器将强制参数为参数声明指定的适当类型时,它的意思是它会查看你的int a
并找到它作为双精度值的内容(在两种情况下都是 4(。编译器这样做是因为它看到函数foo
需要double
但foo
正在获得int
。它不会更改主函数中的a
类型。 main
中的a
始终是一个int
,foo
函数中的a
始终是一个double
。
请参阅:http://en.cppreference.com/w/cpp/language/implicit_cast有关隐式转换的更多信息。
这里实际发生的是编译器意识到foo
接受double
参数,并将int
参数转换为double
。输出显示,在这个特定的系统中,double
是 8 个字节,int
是 4 个字节 - 两者都非常普通。请注意,foo
内部的a
与 main
中的a
不同。它们是不同的东西,即使它们被称为同一件事。
该函数foo
实例化一个新的临时值,也恰好被称为a
,它使用您传递给它的int
为双精度类型。然后,您正在打印此新的临时双精度值的大小。大小为 8,因为在您的平台上,双精度为 8。
教科书幻灯片中的下一张幻灯片清楚地解释了您的编译器在做什么。看看吧:
有时,参数值与函数原型中的参数类型可以通过在调用函数之前将编译器编译为正确的类型。
这些转换按照C++促销规则的规定进行。
促销规则指示如何在没有丢失数据。
整数可以在不更改其值的情况下转换为双精度。
但是,转换为 int 的双精度会截断小数双精度值的一部分。
请记住,双变量可以容纳很多数字比 int 变量的量级大,因此数据丢失可能是相当。
- 如何反转整数参数包
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 试图使用int []作为打字模板,编译器未识别函数最小的原型中的参数
- 我如何在C 中创建一个函数原型,该函数原型接受两个整数作为参数并返回其差异
- C++构造函数原型参数
- 将模板原型作为模板参数传递 - 是否可能
- 如何将用户输入作为参数传递给函数原型
- 为什么函数原型中没有参数是首选
- 当一个参数在函数原型中被赋值时,这意味着什么
- Template:通过函数原型确定模板参数
- 如何用函数原型返回多个参数
- 我不能有一个将多个整数作为参数的构造函数方法/原型吗?阿杜伊诺
- 函数原型中的参数名称
- 在头文件中使用std::vector作为输入参数定义函数原型
- 函数原型和数组参数
- 函数原型中不同的参数名称
- C++:使用一个函数的输出作为带有函数原型的头文件中另一个函数的参数
- 为什么这个参数在regex_match的原型中排序
- 函数原型和参数强制
- 为什么函数原型中的参数数量与定义中的参数不匹配