Что означает оператор «—>» в C/C++: объяснение и примеры использования

Секреты оператора "переход к нулю" в 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 ) { 
    // логика
}

Эти конструкции помогают сделать код компактным и удобным для понимания, подкрепленный мощными стандартами языка.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *