Секреты оператора "переход к нулю" в C и C++
Введение
Недавнее чтение книги «Скрытые возможности и темные углы C++/STL» побудило меня обсудить один интересный фрагмент кода, который можно встретить как в C, так и в C++. Он поражает своей простотой и функциональностью, что позволяет уменьшить значение переменной и одновременно проверять его с нулем.
Пример кода
Вот код, который вызывает интерес:
#include <stdio.h>
int main() {
int x = 10;
while (x-- > 0) { // x goes to 0
printf("%d ", x);
}
}
Вывод:
9 8 7 6 5 4 3 2 1 0
Разбор работы кода
Несмотря на кажущуюся сложность, x-- > 0
является комбинацией двух операторов: --
(пост-декремент) и >
(оператор сравнения). Код decrements x
, возвращая его предыдущее значение, а затем сравнивает его с нулем с помощью оператора >
. То есть, его можно также записать так:
while ((x--) > 0)
Операторы на самом деле
Важно понимать, что -->
не является оператором, это результат работы двух отдельных операторов. Основная операция — декремент (--
), после которого происходит сравнение.
Как это выглядит:
int x = 10;
while (x-- > 0) {
printf("%d ", x);
}
Сначала x
сравнивается с нулем, затем x
уменьшается на единицу. Если мы хотим сначала уменьшить, а затем сравнить, код будет выглядеть следующим образом:
while (--x > 0) { // x goes to 0
printf("%d ", x);
}
Этот код даст нам:
9 8 7 6 5 4 3 2 1
Другие интересные применения
Чтобы увидеть, насколько быстро x
может двигаться к нулю, можно использовать задание скорости декремента:
int x = 100;
while (0 <-------------------- x) {
printf("%d ", x);
}
В этом случае вывод будет:
90 80 70 60 50 40 30 20 10
Стандарты C и C++
Сложность оператора -- >
привела к тому, что его описание было включено в два разных раздела стандарта C++. Первый оператор --
детально описан в §5.2.6/2, а оператор >
в §5.9 стандарта C++03.
Заключение
Операторы в C и C++ подчиняются правиле "максимального пережевывания", что означает, что компиляторы пытаются анализировать выражения до самого большого токена. Это позволяет оптимизировать код для более эффективного выполнения, а также сделать его более лаконичным.
Коды:
#include <stdio.h>
int main() {
int x = 10;
while (x-- > 0) {
printf("%d ", x);
}
}
Iли более длинные вариации в виде:
while( (x--) > 0 ) {
// логика
}
Эти конструкции помогают сделать код компактным и удобным для понимания, подкрепленный мощными стандартами языка.