C++ 在函数调用中获取函数的需求

C++ 在函数调用中获取函数的需求,c++,function,C++,Function,当调用一个具有在其他函数中获得的需求的函数时,在整个函数调用中对其中一个需求进行函数调用是更好还是更差 我用这个简单的例子来说明: int amountToMultiplyBy(int multiplyAmount) { int temp; std::cout << "how much do you want to multiply by: "; std::cin >> temp; multiplyAmount = temp;

当调用一个具有在其他函数中获得的需求的函数时,在整个函数调用中对其中一个需求进行函数调用是更好还是更差

我用这个简单的例子来说明:

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
version 2:

int main()
{
    int multiplyAmount;
    multiplyAmount = amountToMultiplyBy(multiplyAmount);
    sumOfNumbers(5, 10, multiplyAmount);    
    return 0;
}
在版本1中,对
amountToMultiplyBy
的调用在对
sumofNumber
的调用中,在调用过程中获取
multiplyAmount
的值

在版本2中,首先调用
amountToMultiplyBy
,给出
multiplyAmount
的值,然后将其包含在对
sumofNumber
的调用中

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

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

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


警告:后一种形式只能在有单一功能产生副作用的情况下使用。如果有更多这样的函数,它们的求值顺序是未定义的。

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


如前所述,在您的情况下,既然没有来自另一个函数的参数列表的多个函数调用,那么任何一种方法都是好的。

您的
数量乘以
函数代码很奇怪,如果您不使用它,为什么要将它作为参数呢??这样更好:

int amountToMultiplyBy()
{   
    int temp;
    std::cout << "how much do you want to multiply by: ";
    std::cin >> temp;
    return temp;
}
因为不需要新变量来存储数据

PS

int multiplyAmount = amountToMultiplyBy(multiplyAmount)

int multiplyAmount;
multiplyAmount = amountToMultiplyBy(multiplyAmount)

如果编译了这两个版本并查看了输出汇编代码,则最好在声明中初始化变量:

第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版更清晰……最好避免直接将
cin
值添加到参数中。最好创建一个临时变量并返回该临时变量。显然,这并不能回答你的问题。在你的例子中,除了清晰和风格之外,没有太大的区别,但是要小心将赋值表达式作为函数参数传递;表达式的求值顺序没有定义,可能与它们在函数签名中出现的顺序不同。这应该是一个注释我回答了她question@MLMLTL对不起,我不记得我为什么这么说了,所以在上面的基本示例中,由于它的简单性,这并不重要。但在更复杂的编程中,这是一种应该避免的做法?@mltl是的,我们可以这么说。@mltl,记住不要过度使用这种好做法。用变量名混乱作用域以存储简单非抛出函数的瞬时结果,肯定会使代码过于冗长。我已经编辑了我的答案。顺便说一下,函数的参数
amounttomultiply
是不必要的。
int multiplyAmount;
multiplyAmount = amountToMultiplyBy(multiplyAmount)
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
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