2014-03-10 4 views
-4

У меня есть код, который переключает значения в struct.Как сделать этот код кода короче

Например, я считаю себя писать код много, что выглядит следующим образом:

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

Есть ли более компактная версия, которую я могу использовать, чтобы сделать этот код короче?

+1

Вы используете оператор компаньона '==' внутри скобок. Я предполагаю, что вы хотите присвоить '='? –

+0

Упс, отредактирован. Благодарю. – user9993

+1

Если у вас есть только 2 состояния, вы можете использовать int как bool вместо этого и просто использовать «значение» и «значение». Другим решением будет оператор switch. –

ответ

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]; 
+8

Я тоже думал об этом, но мальчик сделает код более трудным для чтения и поддержки. –

+1

Это всего лишь образец кода, и я сомневаюсь, что у него есть только два значения. –

+0

@Joe White, хорошо - OP просит «более короткий» способ, не так ли? (хотя точно так же, как вы, я не совсем уверен, что бы это получилось) ... –

1

Похоже, это довольно общий вопрос, а не точный пример. Я считаю, что для этих простых утверждений одной линии, бросающих брекеты все еще отлично читается:

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

hahhaha .. он просит 1 код строки ... не удаление брекетов ... –

+1

@AxitSoni, где OP запросил одну строку кода? Вопрос был для * короче * кода. Это полностью соответствует. –

+0

жаль, что он отредактировал. может быть .. сначала, когда я увидел этот вопрос в то время, он есть :) –

2

я хотел бы использовать переключатель случай блок внутри метода, если у вас есть несколько значений параметров.

options.test = setOptionTestValue(options.test); 

метод

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

Хороший ответ, хотя это немного не соответствует критериям * короче *, которые ОП спрашивает – streppel

0

Вы должны использовать 'switch', потому что это более красиво:

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

Если у вас есть только этот код, и ничего больше, используйте:

options.test = 3 - options.test; 
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); 

Конечно, если это действительно состояние машины, вы хотели бы использовать перечисление или символические константы, по крайней мере. Но это дает вам возможность вывести логику в отдельную функцию и дать этой функции имя.

0

Для ввода {1,2}:

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

options.test = map[options.test]; 

Регулировка по мере необходимости для другого/ввода дополнительной.

Смежные вопросы