Имитация условных выражений - PullRequest
4 голосов
/ 01 апреля 2011

Как мы можем кодировать условное поведение без , используя if или ? (троичный оператор)?

Одна мысль приходит на ум:

for(;boolean_expression;) {
  // our code
  break;
}

Кто-нибудь еще?

Ответы [ 3 ]

5 голосов
/ 01 апреля 2011

Я надеюсь, что вы не хотите, просто «если» или «троичный».

# 1

Как насчет этого:

Вместоиз: if (condition) printf("Hi");

Использование:

condition && printf("Hi");

Оценка короткого замыкания .Это очень похоже на использование if.

# 2

Для if (condition) a(); else b();

Использование:

int (*p[2])(void) = {b, a};
(p[!!condition])()

Использование массива указателей на функции и двойное отрицание.

# 3

Еще один вариант, близкий к троичному оператору (хотя и функции)

ternary_fn(int cond, int trueVal, int falseVal){
    int arr[2];
    arr[!!cond] = falseVal;
    arr[!cond] = trueVal;
    return arr[0];
}

Используйте это как ret = ternary_fn(a>b, 5, 3) вместо ret = a > b ? 5 : 3;

2 голосов
/ 01 апреля 2011
switch(condition){
  case TRUE:
    ourcode(); 
    break;
  default:
    somethingelse();
 }
1 голос
/ 01 апреля 2011

Использование указателей на функции:

void ourcode(void){puts("Yes!");}
void somethingelse(void){puts("No!");}

void (*_if[])(void) = { somethingelse,ourcode };

int main(void){
  _if[1==1]();
  _if[1==0]();
  return 0;
}

Это зависит от истинных логических выражений, которые оцениваются в 1, что верно для gcc, но я не думаю, что это гарантировано стандартом.

...