В этом случае я бы выбрал решение:
int sign(int i)
{
if (i > 0)
return 1;
else if (i == 0)
return 0;
else
return -1; // i<0
}
То есть я бы добавил еще два предложения - чтобы сделать код более симметричным, а не потому, что это имеет какое-либо значение для генерируемого объектного кода.
Я провел некоторые эксперименты. Я ожидал, что однострочная версия, использующая троичный оператор дважды, генерирует тот же код, что и более длинный. Однако тестирование на Solaris 10 (SPARC) с GCC v4.3.2 показывает, что версия троичного оператора последовательно на 12-16 байт меньше, чем версия 'if'. Тем не менее, наличие или отсутствие дополнительного остального не имеет никакого значения. (Добавление регистра не дало никаких шансов, как я и ожидал.) Добавлено Я также посмотрел на решение Кристофа с 'return (i> 0) - (i <0);' - вариант, который я не видел раньше. Размеры кода были: </p>
Unoptimized Optimized (-O5)
if 166 110
?: 150 98
>-< 122 98
Что в основном показывает, что измерение - это хорошая идея!