开关盒错误|值不能用于常量表达式

时间:2017-10-27 14:41:11

标签: c++ c++11 switch-statement const constexpr

我写了一个简单的例子来解决我在编写程序时遇到的问题。

在程序执行期间,当从函数返回值时,我得到input1和input2的值,然后从不改变。然后在程序过程中进行各种计算后不久,我得到的结果也不再可变。

我正在尝试使用switch-case比较它们,但我得到一个错误“'input1'的值在常量表达式中不可用”。

#include <iostream>

using namespace std;

char getChar()
{
    char c;
    cin >> c;
    return c;
}

int main()
{
    // it doesn't work
    const char input1 = getChar();
    const char input2 = getChar();

    // it it works
    //const char input1 = 'R';
    //const char input2 = 'X';

    char result = getChar();
    switch(result)
    {
        case input1:
            cout << "input1" << endl;
            break;
        case input2:
            cout << "input2" << endl;
            break;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

您必须在编译时知道您的案例陈述。即。

switch(result)
    {
        case 1:
            cout << "input1" << endl;
            break;
        case 2:
            cout << "input2" << endl;
            break;
    }

这些行虽然const只是真正意味着只读而且在编译时没有初始化。

// it doesn't work
const char input1 = getChar();
const char input2 = getChar();

以下两行的工作原因是因为编译器只是在X&amp;在代码运行之前将R放入switch语句

// it it works
//const char input1 = 'R';
//const char input2 = 'X';

我建议您将切换更改为if语句

if(input1)
{}
else if(intput2)
{}

以下代码应该有效:

#include <iostream>

using namespace std;

char getChar()
{
    char c;
    cin >> c;
    return c;
}

int main()
{
    // it doesn't work
    const char input1 = getChar();
    const char input2 = getChar();

    // it it works
    //const char input1 = 'R';
    //const char input2 = 'X';

    char result = getChar();
    if(result == input1){
            cout << "input1" << endl;
    }
    else if(result == input2){
            cout << "input2" << endl;
    }

    return 0;
}

答案 1 :(得分:0)

case语句中使用的标签必须在编译时可供编译器使用,因此您尝试的内容将无效。

你已经成功const,但这只是意味着它一旦初始化就不会改变。

答案 2 :(得分:0)

case标签需要在编译时知道somenthin。变量在此上下文中无法工作。 您将需要if... else if... else if...来模拟具有变量运行时值的switch语句