当调用具有在其他函数中获得的需求的函数时,让函数调用整个函数调用中的一个需求是好还是坏?
我已经用这个简单的例子来证明:
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
的调用中。
我只是想知道这是好的做法,不好的做法,还是只是完全一样?
答案 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)
更好地初始化声明中的变量