函数参数类型必须与C ++中的参数类型相同吗?

时间:2016-01-29 19:04:19

标签: parameters arguments

如果我有C ++代码:

void valFunc(float val)
{
    val = 50;
}

int main()
{
    int mainVal = 9;
    valFunc(mainVal);
    cout << "mainVal: " << mainVal << endl;
    return 0;
}

valFunc的参数是float类型,但参数的类型为int。此代码编译并正确运行。所以我假设在C ++中并不关心参数类型和参数类型是否匹配?

另一个问题: 当我将int mainVal = 9更改为float mainVal = 9.0时,输出仍为9而不是9.0。为什么输出不是9.0?

2 个答案:

答案 0 :(得分:0)

这可能有助于第一个关于int to float conversion的问题:

Implicit type conversion rules in C++ operators

答案 1 :(得分:0)

C ++确实关心参数类型和传递给它的值是否与强类型语言的类型相同。然而,这里发生的是你的整数被隐式地转换为浮点数,这使得它是合法的。请按Microsoft

查看此隐式数字转换表

编辑:

因此您的代码存在一些问题。首先,你的valFunc基本上对你的mainVal变量没有任何作用,注意在你将它传递给函数并且没有赋值50之后该值是如何仍为9?那是因为它是传递值,它实际上是一个变量的副本,并且在函数范围内对它的任何修改都不会持久存在。解决这个问题的方法是传递参考,这可以通过简单地附加&amp;操作符如下所示:

void valFunc(float& val)
{
    val = 50; // Now your mainVal is 50 :)
}

好的,第二个问题:

  

当我将int mainVal = 9更改为float mainVal = 9.0时,输出仍为9而不是9.0。为什么输出不是9.0?

这与您的变量不是浮点值无关,而是与控制台打印您的值的方式有关。要使控制台将值作为浮点打印,您需要在项目中包含iomanip标头并在输出值之前声明已修复。

示例:

#include <iostream>
#include <iomanip>

using namespace std;

void valFunc(float& val) // Assigning the value will now persist
{
    val = 50;
}

int main()
{
    float mainVal = 9;
    valFunc(mainVal);
    cout << "mainVal: " << fixed << mainVal << endl;
    return 0;
}

这会将50.000000的值打印到控制台(请记住这是50而不是9,因为我在valFunc参数中添加了引用运算符,现在值仍然存在,因为它是传递引用)。

您可以添加一个最终触摸以使您的控制台输出更好一些 - 您可以在修复后声明setprecision以告诉控制台要打印多少小数位。

示例:

// Displays mainVal: 50.00
cout << "mainVal: " << fixed << setprecision(2) << mainVal << endl;