Оригинальный ответ
Предполагается, что это C или C ++:
while (cnt++, current->hasChild())
{
current = current->child();
}
Обычно я не большой поклонник оператора запятых, но я не люблю повторяться:)
Обновленный «забавный» ответ
Узнав, что cnt++
на самом деле является многострочной операцией, этот конкретный синтаксис будет не идеальным. Что-то более похожее на ваш принятый ответ будет лучше.
Если вы хотите быть действительно прикольным, это также сработает:
do
{
cnt++;
} while (current->hasChild() && (current = current->child()));
Теперь я чувствую себя очень грязно, потому что злоупотребляю коротким замыканием на операторе &&
:)
Вменяемый ответ
Упражнения на компактность и стремление к удобочитаемому коду, я вынужден сделать вывод, что один из существующих ответов лучше всего подходит (я просто включаю это для полноты картины):
while (true)
{
cnt++;
if (!current->hasChild()) break;
current = current->child();
}
Компилятор while (true)
будет оптимизирован в обычный бесконечный цикл, поэтому есть только один условный оператор (если вам это нужно).
Единственное, что противоречит этому решению, - это если ваш узел был длинным фрагментом кода. Я не возражаю против бесконечных циклов так долго, пока я могу видеть, где они заканчиваются с первого взгляда. Опять же, если оно действительно длинное, оно все равно должно быть функцией.