我有一些代码可以在struct
中切换值。
例如,我发现自己编写的代码很多,如下所示:
if(options.test == 1)
{
options.test = 2;
}
else if (options.test == 2)
{
options.test = 1;
}
我可以使用更紧凑的版本来缩短此代码吗?
答案 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)
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];
根据需要调整其他/更多输入。