获取用户输入后如何在函数中使用常量值

How to use a constant value in a function after getting input from user

所以这里我有一部分代码,我在其中定义宏以将标识符 MIN_BIT 设置为基于用户输入的值:

#define MIN_BITS(n) 1*n
int MIN_BIT = MIN_BITS(n);

然后我在主函数中获取用户输入的 'n' 值。

现在,我有一个函数可以获取 LSB,将其排列在一个数组中,并以相反的顺序打印数组,使 MSB 在左边:

void print_binary( unsigned number )
{
    unsigned bits [ MIN_BIT ] ; // <-- error here
    int count = 0 ;
    while( number>0 || count < MIN_BIT )
    {
        bits [count] = number % 2;
        number >>= 1;
        count++;
    }
    for( int i = count -1; i >=0; i--)
        cout << bits[i];
}

但是,在上面代码中标记为 1 的那一行,我得到了一个错误 "expression must have a constant value"。变量MIN_BIT的值不能作为常量使用。

请提出解决该问题的方法,或以不同方式实施的方法。

试试这个:

#define MIN_BITS(t) (sizeof(t) * 8)

或者,如果您需要支持字节大小不是 8 位的系统,请使用 CHAR_BIT

#define MIN_BITS(t) (sizeof(t) * CHAR_BIT)

那么,你可以这样做:

void print_binary( unsigned number )
{
    const int num_bits = MIN_BITS(number);

    unsigned bits [ num_bits ];
    int count;

    for(count = 0; (number != 0) && (count < num_bits); ++count)
    {
        bits[count] = number & 1;
        number >>= 1;
    }

    for(int i = count-1; i >= 0; --i)
        cout << bits[i];
}

Live demo


您不能使用在运行时确定的值定义静态固定长度数组(称为可变长度数组,它是非标准的,只有少数编译器将其作为额外功能实现)。如果需要,请改用 std::vector

#include <vector>

void print_binary( unsigned number )
{
    std::vector<unsigned> bits;
    bits.reserve(n);

    for(int i = 0; (number != 0) && (i < n); ++i)
    {
        bits.push_back(number & 1);
        number >>= 1;
    }

    for(int i = bits.size()-1; i >= 0; --i)
        cout << bits[i];
}

否则,只需将数组定义为与输入变量物理上可以容纳的最大位数一样大,然后使用用户输入的值来限制您可以在数组中存储多少个值:

#define MAX_BITS(t) (sizeof(t) * CHAR_BIT)

void print_binary( unsigned number )
{
    const int max_bits = MAX_BITS(number);

    unsigned bits [ max_bits ];
    int count;

    for(count = 0; (number != 0) && (count < n) && (count < max_bits); ++count)
    {
        bits[count] = number & 1;
        number >>= 1;
    }

    for(int i = count-1; i >= 0; --i)
        cout << bits[i];
}