首页 > 解决方案 > 从一个案例到另一个案例获取信息

问题描述

我是使用 C++ 的新手,我需要在同一个开关中将一些信息或值从一个案例传递到另一个案例。

就像我有开关一样,我命名了案例 1 和案例 2。在案例 1 中,我将使用用户要给我的变量进行一些数学运算。就像如果输入是 5,我将添加 6,那么将是 11。如果情况 2 我需要该信息,我需要情况 1 已经计算的数量。但我不知道该怎么做。我不喜欢在另一个开关中使用开关,如果它有效,idk,但我不能使用它。谢谢。

标签: c++switch-statement

解决方案


我将假设您提出这个问题的动机是您希望避免编写冗余/重复代码,或者您希望通过不多次执行相同的数学运算来最小化 CPU 周期。下面描述的技术试图解决这两个问题。

第一个问题是:您的代码是否应该一个接一个地执行这两种情况?如果是这样,您可以使用 switch 语句的“fall through”功能来做到这一点,也就是说,通过省略break;第一个 case 末尾的语句,您可以让程序的执行立即“fall through”到下一个 case第一个案例执行,如下所示:

int x = 5;

switch(someVariable)
{
   case 1:
      x += 6;
   // fall through!
   case 2:
      cout << "x=" << x << endl;
   break;
}

或者您可能想要更传统的模式,其中每个结尾case都有一个break;,而您只想执行其中一个案例。在这种情况下,这样做...

int addSix(int x) {return x+6;} // helper function

[...]

int x = 5;

switch(someVariable)
{
   case 1:
      cout << "x=" << addSix(x) << endl;
   break;

   case 2:
      cout << "y=" << addSix(x) << endl;
   break;
}

...避免了编写冗余代码的需要(即您只需将代码写入addSix(int)一个位置),但这确实意味着addSix(int)每次执行 switch 语句时都会执行内部代码。对于微不足道的计算,这很好,但是如果您的计算真的很昂贵,以至于您想尽可能避免多次执行它们怎么办?为此,您可以使用一种称为memoization的技术,它实际上只是将计算结果存储在一个变量中,并在您第一次执行计算时设置一个标志,以便您记住下次不要这样做:

void doReallyExpensiveCalculationOnce(int & x, bool & isCalculationValid)
{
   if (isCalculationValid == false)
   {
      x += 6;  // pretend this operation is really slow/expensive
      isCalculationValid = true;  // remember we already did the calculation
   }
}

bool isCalculationValid = false;
int x = 5;

for (int i=0; i<1000000; i++)
{
   switch(someVariable)
   {
      case 1:
         doReallyExpensiveCalculationOnce(x, isCalculationValid);
         cout << "x=" << x << endl;
      break;

      case 2:
         doReallyExpensiveCalculationOnce(x, isCalculationValid);
         cout << "y=" << x << endl;
      break;
   }
}

请注意,即使上面的 for 循环导致 switch 语句执行 1000000 次,更新 的值的真正昂贵的计算x也只执行(最多)一次。


推荐阅读