我是使用C ++的新手,我需要在同一交换机中将一些信息或值从一个案例传递到另一个案例。
这就像我要切换东西,我命名了案例1和案例2。在案例1中,我将使用用户要给我的变量进行一些数学运算。 就像输入5一样,我要加6,则等于11。 在情况2中,我需要该信息,我需要情况1中已计算的金额。 但是我不知道该怎么做。 我宁愿不要在另一个开关(idk)中使用该开关(如果可以的话),但是我不能使用它。 谢谢。
答案 0 :(得分:1)
我将假设您对此问题的动机是,您希望避免编写冗余/重复的代码,或者希望通过不多次执行相同的数学运算来最大程度地减少CPU周期。下面介绍的技术试图解决这两个问题。
第一个问题是:您的代码是否应该一个接一个地执行两种情况?如果是这样,您可以使用switch语句的“ fall through”功能来做到这一点,也就是说,通过在第一种情况的末尾省略break;
语句,可以让程序的执行“ fall through”为在第一个案例执行后立即执行下一个案例,例如:
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)
内的代码每次都会执行切换语句被执行。对于微不足道的计算而言,这很好,但是如果您的计算确实在计算上确实非常昂贵,以至于您想避免尽可能多地执行一次该怎么办?为此,您可以使用称为 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循环使开关语句执行了1000000次,但仅执行更新价格x
的非常昂贵的计算(最多)一次。