在函数调用中获取函数的要求

时间:2015-06-02 15:44:23

标签: c++ function

当调用具有在其他函数中获得的需求的函数时,让函数调用整个函数调用中的一个需求是好还是坏?

我已经用这个简单的例子来证明:

int amountToMultiplyBy(int multiplyAmount)
{   
    int temp;
    std::cout << "how much do you want to multiply by: ";
    std::cin >> temp;
    multiplyAmount = temp;
    return multiplyAmount;
}
void sumOfNumbers(int numOne, int numTwo, int multiplyAmount)
{
    std::cout << "1: " << numOne * multiplyAmount << std::endl;
    std::cout << "2: " << numTwo * multiplyAmount << std::endl;
}

main版本1:

int main()
{
    int multiplyAmount;    
    sumOfNumbers(5, 10, amountToMultiplyBy(multiplyAmount));
    return 0;
}

main第2版:

int main()
{
    int multiplyAmount;
    multiplyAmount = amountToMultiplyBy(multiplyAmount);
    sumOfNumbers(5, 10, multiplyAmount);    
    return 0;
}

在版本1中,对amountToMultiplyBy的来电是在sumOfNumbers的来电中,在通话过程中获取multiplyAmount的值。

在版本2中,amountToMultiplyBy首先调用multiplyAmount的值,然后将其包含在sumOfNumbers的调用中。

我只是想知道这是好的做法,不好的做法,还是只是完全一样?

4 个答案:

答案 0 :(得分:4)

将多个函数作为另一个函数的参数调用不是一个好习惯。因为我们无法保证内部函数的顺序被调用。如果内部函数具有数据依赖性,则可能会产生一些错误。

如上所述,在你的情况下,由于没有多个函数调用来自另一个函数的参数列表,无论哪种方式都可以。

答案 1 :(得分:1)

如果您编译了这两个版本并查看输出汇编代码:

版本1:

00af 8B45FC         movl    -4(%rbp), %eax
00b2 89C7           movl    %eax, %edi
00b4 E8000000       call    _Z18amountToMultiplyByi
     00
00b9 8945FC         movl    %eax, -4(%rbp)
00bc 8B45FC         movl    -4(%rbp), %eax
00bf 89C2           movl    %eax, %edx
00c1 BE0A0000       movl    $10, %esi
     00
00c6 BF050000       movl    $5, %edi
     00
00cb E8000000       call    _Z12sumOfNumbersiii

第2版:

00af 8B45FC         movl    -4(%rbp), %eax
00b2 89C7           movl    %eax, %edi
00b4 E8000000       call    _Z18amountToMultiplyByi
     00
00b9 8945FC         movl    %eax, -4(%rbp)
00bc 8B45FC         movl    -4(%rbp), %eax
00bf 89C2           movl    %eax, %edx
00c1 BE0A0000       movl    $10, %esi
     00
00c6 BF050000       movl    $5, %edi
     00
00cb E8000000       call    _Z12sumOfNumbersiii

你会发现两者的输出完全相同。

答案 2 :(得分:0)

int main()
{
    int multiplyAmount = amountToMultiplyBy();
    sumOfNumbers(5, 10, multiplyAmount);    
    return 0;
}

int main()
{
    sumOfNumbers(5, 10, amountToMultiplyBy());    
    return 0;
}

前者更适合调试,因为你在变量中有值。后者更短。

警告:仅当存在具有副作用的单个功能时,才能使用后一种形式。如果有更多此类功能,则其评估顺序未定义。

答案 3 :(得分:0)

你的amountToMultiplyBy函数代码很奇怪,如果不使用它,为什么要将multiplyAmount作为参数?这样更好:

int amountToMultiplyBy()
{   
    int temp;
    std::cout << "how much do you want to multiply by: ";
    std::cin >> temp;
    return temp;
}

这是一个更好的电话:

sumOfNumbers(5, 10, amountToMultiplyBy());

因为您不需要新变量来存储数据

<强> PS

int multiplyAmount = amountToMultiplyBy(multiplyAmount)

优于

int multiplyAmount;
multiplyAmount = amountToMultiplyBy(multiplyAmount)

更好地初始化声明中的变量