Так часто приходится писать такой код:
Так как у операторов + и — такой низкий приоритет, то приходится постоянно заключать их в скобки, а это приводит к глубокому вложенному коду, который сложно понять.
В Visual Studio 2015 RC добавлена пара экспериментальных операторов, названных операторы–головастики. Они позволяют добавлять и вычитать единицу без необходимости прибегать к скобкам.
Они так названы, так как напоминают головастиков, которые плывут к или от значения. Тильда это голова, а минус — хвост.
Чтобы включить экспериментальную поддержку операторов–головастиков, добавьте в начале C++ файла:
Вот простая программа, которая демонстрирует применение операторов–головастиков:
Помните, что эти операторы всё ещё экспериментальные. Они не являются официальной частью языка Си++, но вы можете поиграть с ними и оставить ваши замечания здесь.
x = (y + 1) % 10; x = (y + 1) * (z - 1); x = (double)(f(y) + 1);
Так как у операторов + и — такой низкий приоритет, то приходится постоянно заключать их в скобки, а это приводит к глубокому вложенному коду, который сложно понять.
В Visual Studio 2015 RC добавлена пара экспериментальных операторов, названных операторы–головастики. Они позволяют добавлять и вычитать единицу без необходимости прибегать к скобкам.
x = -~y % 10; x = -~y * ~-z; x = (double)-~f(y);
Они так названы, так как напоминают головастиков, которые плывут к или от значения. Тильда это голова, а минус — хвост.
| Синтакс | Значение | Мнемоника |
|---|---|---|
| -~y | y + 1 | Головастик плывет к значению и делает его больше |
| ~-y | y — 1 | Головастик плывет от значения и делает его меньше |
Чтобы включить экспериментальную поддержку операторов–головастиков, добавьте в начале C++ файла:
#define __ENABLE_EXPERIMENTAL_TADPOLE_OPERATORS
Вот простая программа, которая демонстрирует применение операторов–головастиков:
#define __ENABLE_EXPERIMENTAL_TADPOLE_OPERATORS #include <ios> #include <iostream> #include <istream> int __cdecl main(int, char**) { int n = 3; std::cout << "3 + 1 = " << -~n << std::endl; std::cout << "(3 - 1) * (3 + 1) " << ~-n * -~n << std::endl; return 0; }
Помните, что эти операторы всё ещё экспериментальные. Они не являются официальной частью языка Си++, но вы можете поиграть с ними и оставить ваши замечания здесь.
От переводчика
Решил всё-таки добавить объяснение того, что происходит непосредственно в статью.
При представлении чисел в дополнительном коде выполняется соотношение между арифметическими и побитовыми операциями:
Из чего логично получается:
Т. е. никаких новых операторов–головастиков в Си++ не вводят, это просто шутка от Реймонда Чена.
Другие неочевидные операции в Си++ можно посмотреть на этой странице.
При представлении чисел в дополнительном коде выполняется соотношение между арифметическими и побитовыми операциями:
-x = ~x + 1;
Из чего логично получается:
-~x = ~(~x) + 1 = x + 1; ~-x = (~-x + 1) - 1 = -(-x) - 1 = x - 1;
Т. е. никаких новых операторов–головастиков в Си++ не вводят, это просто шутка от Реймонда Чена.
Другие неочевидные операции в Си++ можно посмотреть на этой странице.
