Несмотря на то, что вся логика сведена в одну строку, проблема на самом деле в одном выражении (простите за добавление пробелов):
(n%2) ? n=3*n+1 : n/=2
Правила приоритета для выражений C подобнытот.Назначение (и это включает составное назначение) связывает менее плотно, чем ?:
.Таким образом, компилятор должен интерпретировать то, что вы написали как:
((n%2) ? n=3*n+1 : n) /=2
Поскольку ?:
не выдает lvalue (что-то, что может появиться слева от назначения), вы получаете ошибку.Использование круглых скобок заставляет приоритет совпадать с тем, что вы хотели.
Но еще лучший способ написать это не быть «умным» и думать, что есть некоторая «элегантность» в использовании как можно большего количества токенов вединое выражение.Вот еще одна версия, которая гораздо удобнее для чтения и которую легче проверить как правильную:
if (n%2) {
n = 3*n+1;
} else {
n /= 2;
}
И это не менее эффективно, чем использование условного выражения.