在switch case语句中未定义的变量

时间:2020-03-18 08:39:44

标签: c++ scope switch-statement declaration

这是我的开关案例说明。编译器不断声明totalShare尚未定义,即使是在情况1中也定义了。我是C ++的初学者,刚刚开始学习栈。

switch (option)
{
    case 1:
    {
        string newStock;
        double share;
        double price;

        cout << "Enter a new stock: " ;
        cin >> newStock;

        cout << "Enter a number of shares: " ;
        cin >> share;

        cout << "Enter price [for that number of shares]:  " ;
        cin >> price;

        //share x price
        double sharePrice = share * price;

        //add to stack
        newStockStack.push(sharePrice);

        //total share
        double totalShare;
        totalShare += share;
        break;
    }

    case 2:
    {
        //calculate stacks
        double theTotal;
        while (!newStockStack.empty())
        {
            theTotal += newStockStack.top();
            newStockStack.pop();
            return theTotal;
        }
        // FORMULA
        //((every share x price)+ (every share x price)) / total number of shares

        double LifoPrice;
        LifoPrice = (theTotal / totalShare);
        cout << "The Lifo price for the stock is: " << LifoPrice << endl;
        break;
    }

2 个答案:

答案 0 :(得分:1)

double totalShare;位于“案例1”区块

这意味着totalShare对于该块而言是本地的,即,其范围仅在情况1内,并且在该块之外不可见。

但是您在{strong>“案例2”区块中有LifoPrice = (theTotal / totalShare);。因此,您的编译器会抱怨未定义 totalShare (在第2种情况下)。

解决方案:

在这样一个范围内定义该变量,以便可以在任何需要的地方使用它。在这种情况下,由于您需要在多个case块中使用该变量,因此请考虑在switch语句之外声明该变量。因为限制变量的范围是一种很好的做法,所以如果仅在switch语句内需要该变量,则可以在switch语句内但在需要totalShare的所有case块之前声明它。

答案 1 :(得分:1)

变量totalShare在块作用域中的标签case 1:下声明。

case 1:
{
    //...

    //total share
    double totalShare;
    totalShare += share;
    break;
}

因此,在标签case 2:下的块范围中,它不可见

LifoPrice = (theTotal / totalShare);

您可以在任何大小写标签之前声明变量。

或者,如果编译器支持C ++ 17标准,则可以在switch语句中声明它。

相关问题