Что такое оператор «-->» в C++?
-
10-07-2019 - |
Вопрос
После прочтения Скрытые возможности и темные уголки C++/STL на comp.lang.c++.moderated
, я был совершенно удивлен тем, что следующий фрагмент скомпилирован и работает как в Visual Studio 2008, так и в G++ 4.4.
Вот код:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Я предполагаю, что это C, поскольку он работает и в GCC.Где это определено в стандарте и откуда оно взялось?
Решение
- >
не является оператором. Фактически это два отдельных оператора: -
и >
.
Код условия уменьшает значение x
, возвращая исходное (не уменьшенное) значение x
, а затем сравнивает исходное значение с 0
используя оператор >
.
Чтобы лучше понять, утверждение можно записать следующим образом:
while( (x--) > 0 )
Другие советы
Или для чего-то совершенно другого ... х скользит к 0
while (x --\
\
\
\
> 0)
printf("%d ", x);
Не так математично, но ... каждая картина рисует тысячу слов ...
Это очень сложный оператор, поэтому даже JTC1 ISO / IEC (Объединенный технический комитет 1) поместил его описание в две разные части стандарта C ++.
Не говоря уже о шутках, это два разных оператора: -
и >
, описанные соответственно в & # 167; 5.2.6 / 2 и & # 167; 5.9 из Стандарт C ++ 03.
Это эквивалентно
while (x-- > 0)
x -
(после декремента) эквивалентен x = x-1
, поэтому код преобразуется в:
while(x > 0) {
x = x-1;
// logic
}
x
может идти к нулю еще быстрее в противоположном направлении:
int x = 10;
while( 0 <---- x )
{
printf("%d ", x);
}
8 6 4 2
Вы можете контролировать скорость с помощью стрелы!
int x = 100;
while( 0 <-------------------- x )
{
printf("%d ", x);
}
90 80 70 60 50 40 30 20 10
;)
Его
#include <stdio.h>
int main(void){
int x = 10;
while( x-- > 0 ){ // x goes to 0
printf("%d ", x);
}
return 0;
}
Только пространство делает вещи забавными, --
декременты и >
сравнивает.
Использование - >
имеет историческое значение. Уменьшение было (и остается в некоторых случаях) быстрее, чем увеличение в архитектуре x86. Использование ->
предполагает, что x
будет 0
, и привлекает тех, кто имеет математическое образование.
while( x-- > 0 )
это то, как это анализируется.
Совершенно отвратительный, но я буду использовать это:
#define as ;while
int main(int argc, char* argv[])
{
int n = atoi(argv[1]);
do printf("n is %d\n", n) as ( n --> 0);
return 0;
}
В одной из прочитанных мной книг (я не помню, какая из них написана правильно) сказано: Компиляторы пытаются анализировать выражения по самому большому токену , используя правило левого и правого.
В этом случае выражение:
x-->0
Анализирует самые большие токены:
token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0
То же правило применяется к этому выражению:
a-----b
После разбора:
token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b
Надеюсь, это поможет понять сложное выражение ^^
Это точно так же, как
while (x--)
{
printf("%d ", x);
}
для неотрицательных чисел
В любом случае, у нас есть " идет к " Оператор сейчас. " - >
легко запомнить как направление, и "когда x обращается в ноль" значит прямо.
Кроме того, это немного более эффективно, чем " for (x = 10; x > 0; x -) "
на некоторых платформах.
Этот код сначала сравнивает x и 0, а затем уменьшает x. (Также сказано в первом ответе: вы после x уменьшаете, а затем сравниваете x и 0 с помощью оператора >
.) Смотрите вывод этого кода:
9 8 7 6 5 4 3 2 1 0
Теперь мы сначала сравним, а затем уменьшим, увидев 0 в выводе.
Если мы хотим сначала уменьшить, а затем сравнить, используйте этот код:
#include <stdio.h>
int main(void)
{
int x = 10;
while( --x> 0 ) // x goes to 0
{
printf("%d ", x);
}
return 0;
}
Это вывод:
9 8 7 6 5 4 3 2 1
Мой компилятор распечатает 9876543210 при запуске этого кода.
#include <iostream>
int main()
{
int x = 10;
while( x --> 0 ) // x goes to 0
{
std::cout << x;
}
}
Как и ожидалось. while (x-- > 0)
фактически означает while (x > 0)
. x -
опубликовать декреты x
.
while( x > 0 )
{
x--;
std::cout << x;
}
это другой способ написания одной и той же вещи.
Приятно, что оригинал выглядит как " в то время как x переходит в 0 " хотя.
Между -
и >
отсутствует пробел. x
пост-декрементируется, то есть декрементируется после проверки условия x > 0?
.
-
- оператор декремент , а >
- оператор больше чем .
Два оператора применяются как один, например ->>
.
Это комбинация двух операторов. Сначала -
- для уменьшения значения, а >
- для проверки, больше ли значение правого операнда.
#include<stdio.h>
int main()
{
int x = 10;
while (x-- > 0)
printf("%d ",x);
return 0;
}
Результат будет:
9 8 7 6 5 4 3 2 1 0
На самом деле, x
пост-декрементный, и с этим условием проверяется. Это не - >
, это (x--) > 0 код>
Примечание. Значение x
изменяется после проверки условия, поскольку оно выполняется после уменьшения. Также могут возникнуть некоторые похожие случаи, например:
--> x-->0
++> x++>0
-->= x-->=0
++>= x++>=0
C и C ++ подчиняются правилам " максимальный munch " править. Точно так же как a --- b переводится в Правило, по сути, говорит о том, что при движении слева направо выражения формируются путем взятия максимального количества символов, которые образуют правильное выражение. Р> (a--) - b
, в вашем случае x - > 0
переводится в (x- -) & GT;. 0 код> р>
Почему все осложнения?
Простой ответ на оригинальный вопрос:
#include <stdio.h>
int main()
{
int x = 10;
while (x > 0)
{
printf("%d ", x);
x = x-1;
}
}
Делает то же самое. Не говорю, что вы должны делать это так, но он делает то же самое и ответил бы на вопрос в одном посте.
x -
- это просто сокращение для вышеупомянутого, а >
- просто обычный оператор больше, чем
. Нет большой загадки!
В наши дни слишком много людей делают сложные вещи сложными;)
Традиционным образом мы определяем условие в круглых скобках while
()
и завершающее условие внутри фигурных скобок {}
, но - >
определяет оба сразу.
Например:
int abc(void)
{
int a = 5
while((a--) > 0) // Decrement and comparison both at once
{
// Code
}
}
Это уменьшает a
и запускает цикл, пока a
больше 0
.
Условно это будет выглядеть так:
int abc(void)
{
int a = 5;
while(a > 0)
{
a--;
// Code
}
a--;
}
В обоих случаях мы делаем одно и то же и достигаем одинаковых целей.