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