Идеальная структура оператора для двух логических значений - PullRequest
3 голосов
/ 16 марта 2011

Я не совсем знал, что искать, - но я искал элегантный способ, если это возможно, структурировать оператор if, который использует два логических значения, которые могли бы легко вывести все четыре возможности.

Переменные:

bool a = true;
bool b = true;

Я не был уверен, что существует ли лучшая практика с точки зрения проверки обоих на негативность, а затем продолжения и т. Д.

Очень наскоро написанный пример:

if(!a && !b)
{
   //Output (-,-)
}
else
{
   if(a || b)
   {
       if(a)
       {
           //Output (+,-)
       }
       else
       {
           //Output (-,+)
       }
   }
   else
   {
       //Output (+,+)
   }
}

Извините за все чайки ( {} ) Я немного наркоман форматирования.В любом случае - спасибо за любые предложения!

Ответы [ 7 ]

3 голосов
/ 16 марта 2011

Это зависит от того, как вы определяете элегантность.

Итак, я собираюсь пойти с моим собственным определением:

  1. Симметричный.
  2. Читаемый.
  3. Предотвращает ненужную сложность.

Имея это в виду, я бы просто сказал:

if( a ) {
  if( b ) {
     ...
  } else {
     ...
  }
} else {
  if( b ) {
     ...
  } else {
     ...
  }
}

Это не менее многословно, чем ваша идея, но впо крайней мере, это кристально ясно, что там подразумевается.

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

  1. Использовать (двумерный) константный массив для извлечения значения, если все, что вам нужно сделать, это присвоить значение переменной.
  2. Перефразировать весь блокчтобы избежать избыточного вызова аналогичного кода.Возможно вычеркните одну из проверок в функцию.
  3. Вам может не понадобиться два отдельных логических значения вообще, одна переменная с 4 возможными значениями будет более выразительной, и тогда вы сможете использовать структуру switch / case.
3 голосов
/ 16 марта 2011

Я не совсем уверен, что понял, о чем вы спрашиваете ... вы просто хотите, чтобы заявление if охватывало все четыре варианта?

Если это так, вот один простой способ сделать это:

if (a && b)
    // Output (+, +)
else if (!a && b)
    // Output (-, +)
else if (a && !b)
    // Output (+, -)
else
    // Output (-, -)

Если это не то, что вы ищете, дайте мне знать, и я заберу этот пост.

2 голосов
/ 16 марта 2011

В идеале вы бы вообще не использовали if ...

case a, b of
  true, true => "+,+"
| false, true => "-,+"
| true, false => "+,-"
| false, false => "-,-"

Если вы хотите нарушить корпоративный стандарт кодирования C и протестировать оптимизатор компилятора C, вы можете аппроксимировать это в C с помощью

switch (((!!a) * 2) + (!!b))
{
  case 3: \\ "+,+"
    break;
  case 2: \\ "+,-"
    break;
  case 1: \\ "-,+"
    break;
  case 0: \\ "-,-"
    break;
}
0 голосов
/ 06 мая 2016

Статический анализ может быть использован для улучшения ответа @templatetypedef. Лично я предпочитаю это, так как это более кратко, чем @biziclop answer

if (a && b) {
  // Output (+, +)
} else if (a) {
  // Output (+, -)
} else if (b) {
  // Output (+, -)    
} else {
  // Output (-, -)
}

И может быть обобщено на более чем две переменные, например,

if (a && b && c)  {

} else if (a && b) {

} else if (a && c) {

} else if (b && c) {

} else if (a) {

} else if (b) {

} else if (c) {

} else {

}
0 голосов
/ 19 марта 2011

Я думаю, вы хотите это:

char table[2] = {'-','+'};
printf("(name%c,id%c)",table[!!name],table[!!id]);

ура! * * 1004

0 голосов
/ 16 марта 2011

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

result = (name & id) ? "(+,+)" : 
         (!name & !id) ? "(-,-)" : 
         (name & !id) ? "(+,-)" : "(-,+)";

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

0 голосов
/ 16 марта 2011

Следующий фрагмент не поддерживается. Во всяком случае

Output(strings[(a ? 2 : 0) + (b ? 1 : 0)])
...