Часто создается логика ветвления, но очень возможно выполнить троичную операцию без какого-либо вида ветвления, если вы в порядке с обоими оцениваемыми значениями. Учтите это:
#include <stdio.h>
static inline int isel(int cond, int a, int b)
{
int mask = cond | (-cond);
mask >>= 31;
return (b & mask) | (a & ~mask);
}
int main(void)
{
printf("1 ? 3 : 4 => %d\n", isel(1, 3, 4));
printf("0 ? 3 : 4 => %d\n", isel(0, 3, 4));
printf("-1 ? 3 : 4 => %d\n", isel(-1, 3, 4));
return 0;
}
В этом коде предполагается, что смещение вправо чисел со знаком будет расширяться со знаком, а размер size (int) == 4.
Некоторые процессоры могут выполнять isel () как инструкцию по сборке. Тем не менее, оба значения будут оценены, что троичный?: Не делает.
В зависимости от ситуации, компилятор, как правило, пытается делать самые быстрые действия: либо ветвление, чтобы избежать избыточных вычислений, либо выполнение такой логики, если значения в троичном выражении простые.