C ++根据条件初始化变量

时间:2018-07-27 09:44:24

标签: c++ initialization conditional

我目前正在尝试弄清如何根据条件初始化变量。这是我要修改的当前代码:

int dimsOut[4];
dimsOut[0] = data->nDataVar();
dimsOut[1] = dims[0];
dimsOut[2] = dims[1];
dimsOut[3] = dims[2];

const size_t dataSize = data->primType().getTypeSize() * dimsOut[0] * dimsOut[1] * dimsOut[2] * dimsOut[3];

由于这是一个大型项目的一部分(大部分是C ++ 98,其中包括C ++ 03的某些部分),因此我想尽量减少修改,以免在其余代码中出现任何问题。 因此,我想做的只是在data->nDataVar()返回1的情况下执行上面的代码,并在返回其他内容的情况下 基本上做到这一点

int dimsOut[3];
dimsOut[0] = data->nDataVar();
dimsOut[1] = dims[0];
dimsOut[2] = dims[1];

const size_t dataSize = data->primType().getTypeSize() * dimsOut[0] * dimsOut[1] * dimsOut[2];

我知道无法使用if语句,因为变量将超出范围。

编辑:我现在解决了我的问题。它虽然不漂亮,但却可以实现预期的效果。

Edit2:零钱

    int decide_dimension = data->nDataVar();
    std::vector<int> dimsOut;
    dimsOut.resize(3);
    dimsOut[0] = dims[0];
    dimsOut[1] = dims[1];
    dimsOut[2] = dims[2];
    if (decide_dimension != 1)
    {
        dimsOut.push_back(data->nDataVar());
    }

const size_t dataSize = data->primType().getTypeSize() * dimsOut[0] * dimsOut[1] * dimsOut[2] * ((decide_dimension == 1) ? 1 : dimsOut[3]);

4 个答案:

答案 0 :(得分:0)

您可以使用三元或条件运算符。基本形式是:

condition ? valueIfTrue : valueIfFalse

示例:

const char* x = (SomeFunction() == 0) ? "is null" : "is not null";

SomeFunction()返回0时,x用“ is null”初始化,否则 加上“ is not null”。

答案 1 :(得分:0)

您想实现的目标是不可能的。您唯一可以做的就是按照建议用三元数初始化它们,或者将初始化移到if块中,而忽略声明。

答案 2 :(得分:0)

您说您正在修改现有的旧项目。在这种情况下,将更改保持在最低水平是很有意义的。

但是,您无法在运行时定义静态数组的大小。如果需要,可以将数组保持当前状态,并确保在data-> nDataVar()!= 1时不使用第4个元素。

然后:

const size_t dataSize = data->primType().getTypeSize() * dimsOut[0] * dimsOut[1] * dimsOut[2] * (data->nDataVar() != 1 ? 1 : dimsOut[3]);

值得一提的是,dimsOut数组似乎完全不需要计算dataSize的值,但是谁知道您的代码还用它做什么呢?如果仅在单个函数/方法中使用它,则可以轻松地将其替换为其他东西,例如std :: vector。

答案 3 :(得分:0)

您的问题有点令人困惑,或者提供的信息不足。目前尚不清楚其他地方是否需要dimsOut[]变量。如果仅将其用于dataSize的计算,则可以直接使用dims[]数组并执行以下操作:

int typeSize = data->primType().getTypeSize() * data->nDataVar();
int dimension = dims[0] * dims[1] * ((condition) ? dims[2] : 1);
const size_t dataSize = typeSize * dimension;

如果在其他地方使用dimsOut,则可以使用第一个块通过三元运算符修改dimsOut [3]分配:

int dimsOut[4];
dimsOut[0] = data->nDataVar();
dimsOut[1] = dims[0];
dimsOut[2] = dims[1];
dimsOut[3] = (condition) ? dims[2] : 1;

const size_t dataSize = data->primType().getTypeSize() * dimsOut[0] * dimsOut[1] * dimsOut[2] * dimsOut[3];