Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该在if条件中使用直接函数调用还是首先存储变量?_C++ - Fatal编程技术网

C++ 我应该在if条件中使用直接函数调用还是首先存储变量?

C++ 我应该在if条件中使用直接函数调用还是首先存储变量?,c++,C++,在以下代码中,检查if条件的首选方法是什么: 使用变量agex或直接函数调用(如下所示) #包括 使用名称空间std; 甲级 {公众: 智力年龄; bool checkAgeMinor(); }; boola::checkAgeMinor() { 如果(年龄>=18岁) 返回true; 其他的 返回false; } int main() { A A; bool agex=a.checkAgeMinor(); cout我认为您应该使用agex。根据我的理解,您所做的将再次调用函数,并且在更改程序计

在以下代码中,检查if条件的首选方法是什么: 使用变量agex或直接函数调用(如下所示)

#包括
使用名称空间std;
甲级
{公众:
智力年龄;
bool checkAgeMinor();
};
boola::checkAgeMinor()
{
如果(年龄>=18岁)
返回true;
其他的
返回false;
}
int main()
{
A A;
bool agex=a.checkAgeMinor();

cout我认为您应该使用
agex
。根据我的理解,您所做的将再次调用函数,并且在更改程序计数器、为调用函数分配内存等过程中会涉及一些计算时间。而在另一种情况下,我们只需查看特定内存位置的值。因此包括查找。

您已经检查了年龄;无需再次检查

您在
bool
中已经有了此信息,所以请使用它。将其设置为
const
,以便更好地测量

只有当您有理由相信该值在此期间可能已更改(或者存在严重的可读性问题)时,才会再次调用该函数。

  • 如果多次使用函数调用结果(如下所示:打印 我建议将其存储到变量中,然后 然后使用变量。这是一个安全的方法,不会中断 如果有人认为该功能应该有副作用,那么 如果多次调用该函数,可能会产生意外结果

  • 但是,如果函数具有良好的名称,并且可以预期 无副作用/显著的运行时间,则完全可以 直接调用它多次。例如 getter类似于
    getAge()
    ,它可能不会进行任何计算 而且不会有副作用

  • 另一点需要注意的是,如果函数结果可能改变 (无论出于何种原因),您显然必须再次致电 获取更新的结果。在您的情况下,使用 在代码的中间会改变年龄,因此调用函数 多次都没什么用

请注意,我没有对性能做出任何评论。这是因为,除非您的函数很昂贵,否则多次调用它和一次调用它之间的区别基本上是无关的。将
bool
存储到变量对编译器来说也或多或少是免费的(因为您的CPU无论如何都与寄存器一起工作),因此存储函数结果与直接使用函数结果之间没有可测量的差别。在证明存在性能问题之前,您不必担心这一点


至于你的具体例子:

您已经存储了bool一次。此时,只需继续使用它。再次调用该函数是没有用的(除非其结果可能不同,但此处不希望年龄发生变化,如果发生变化,代码将中断)。此外,第二个
if
应该是第一个的
else
分支。当您使用它时,可以给变量一个更好的名称:

  // Returns whether age >= 18, I find the function name confusing...
  bool isAdult = a.checkAgeMinor();
  // What does "Age is true" mean?
  cout << "Age is " << isAdult << std::endl;

  if (!isAdult)
  {
    std::cout << "age less than 18" << std::endl;
    return 1;
  }
  else
  {
    std::cout << "Do something" << std::endl;
    return 0;
  }
//返回是否年龄>=18,我发现函数名令人困惑。。。
bool isAdult=a.checkAgeMinor();
//“年龄是真的”是什么意思?

cout让我们采取一个非常简单的观点,假设我们不知道
checkAgeMinor()
实际在做什么。您使用它返回的值3次。现在让我们假设它返回的值可能在您使用该值的位置之间发生变化。如果是这样,您的代码是否正确?否

你实际上想要的是3倍相同的值,否则你会得到不一致的输出。不要浪费时间去思考实现细节,而是考虑当前范围内的代码应该做什么。它不应该对 CigaGeMimor < /C>的突然变化作出反应,但是它应该调用该方法来获得根据这个价值观做一些事情。所以你真正想要的是:

bool agex = a.checkAgeMinor();
std::cout << "Age is" << agex << '\n';
if(!agex) 
{
   std::cout << "age less than 18" << '\n';
   return 1;
} else {
   std::cout << "Do something" << '\n';
   return 0;
}
bool agex=a.checkAgeMinor();

std::不能试图智胜编译器。我打赌不管您使用的是变量还是函数调用,它都将被编译到同一个程序集code@VinayShukla如果不再使用结果,我建议不要创建临时变量。如果需要多次访问该值,我将创建临时变量。不仅在性能方面,而且在可读性方面。我已经看过很多次了,但是为什么(条件)返回true;否则返回false;为什么不只是返回条件?@AndrewKashpur没有理由这么做,我也更喜欢
返回条件;
顺便说一句,这里的强制性警告是不要太在意“最佳实践”一般来说,通常没有这样的事情。我也有类似的观点,但创建变量的开销比函数调用更优化吗???@VinayShukla为什么你关心哪一个更快?在你展示的程序中,没有可测量的差异。让你的程序快两纳秒是没有意义的。@VinayShukla计算几个t在你的例子中,IME比存储结果的开销更大,为了比较它,结果需要保存在任何地方,无论如何我认为它实际上取决于函数。如果函数较小,那么传入函数可能会更好。但是如果该函数中有1000行,那么反复调用函数将不是一个好方法比较函数调用的开销和调用std::cout所需的时间,你会发现这其实并不重要
bool agex = a.checkAgeMinor();
std::cout << "Age is" << agex << '\n';
if(!agex) 
{
   std::cout << "age less than 18" << '\n';
   return 1;
} else {
   std::cout << "Do something" << '\n';
   return 0;
}