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