如何缩短此C代码

时间:2014-03-10 11:54:45

标签: c

我有一些代码可以在struct中切换值。

例如,我发现自己编写的代码很多,如下所示:

if(options.test == 1)
{
    options.test = 2;
}
else if (options.test == 2)
{
    options.test = 1;
}

我可以使用更紧凑的版本来缩短此代码吗?

6 个答案:

答案 0 :(得分:8)

如果在整个程序执行过程中options.test的值为1或2,那么您只需执行以下操作:

options.test = 3-options.test;

如果此变量可以设置为其他值,那么处理它的最佳方法通常是:

switch (options.test)
{
    case 1:   options.test = 2;   break;
    case 2:   options.test = 1;   break;
    case ...: options.test = ...; break;
    case ...: options.test = ...; break;
    case ...: options.test = ...; break;
    default:  options.test = ...; break;
}

如果值介于0和N之间(N相对较小),那么您也可以考虑散列。

例如,而不是:

switch (options.test)
{
    case 0: options.test = 4; break;
    case 1: options.test = 2; break;
    case 2: options.test = 1; break;
    case 3: options.test = 3; break;
    case 4: options.test = 5; break;
    case 5: options.test = 0; break;
}

你可以这样做:

static int hash[] = {4,2,1,3,5,0};
options.test = hash[options.test];

答案 1 :(得分:2)

如果你有多个选项值,我会在方法中使用switch case块。

options.test = setOptionTestValue(options.test);

方法

int setOptionTestValue(value) {
    switch (value) {
        case 1: return 2;
        case 2: return 1;
        default: return 0;
    }
}

答案 2 :(得分:1)

听起来这是一个相当普遍的问题,而不是一个确切的例子。我发现对于这些简单的单行语句,删除括号仍然是完全可读的:

if(options.test == 1)
    options.test = 2;
else if (options.test == 2)
    options.test = 1;

答案 3 :(得分:0)

你应该使用'switch',因为它更漂亮:

switch (options.test) {
   case 1:
      options.test = 2;
      break;
   case 2:
      options.test = 1;
      break;
}

如果您只有此代码,请使用此代码:

options.test = 3 - options.test;

答案 4 :(得分:0)

这看起来可能是state machine,特别是因为你说过你一直在编写这段代码(每种类型的状态转换一次?)。如何创建一个返回新状态的函数?

int getNewStateAfterLogin(int oldState) {
    switch (oldState) {
        case 1:
            return 2;
        case 2:
            return 1;
        default:
            return oldState;
    }
}

options.test = getNewStateAfterLogin(options.test);

当然,如果它真的是状态机,你至少要使用枚举或符号常量。但这使您有机会将逻辑拉入单独的函数,并为该函数命名。

答案 5 :(得分:0)

输入{1,2}

int map[3]  = {0, 2, 1};

options.test = map[options.test];

根据需要调整其他/更多输入。