После прочтения скрытых объектов и темные углы 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);
}
}
Вывод:
9 8 7 6 5 4 3 2 1 0
Я бы предположил, что это C, так как он работает и в GCC. Где это определено в стандарте и откуда оно взято?
c++
c
operators
code-formatting
standards-compliance
GManNickG
источник
источник
++
или--
#define upto ++<
,#define downto -->
. Если вы чувствуете зло, вы можете сделать#define for while(
и#define do ) {
(и#define done ;}
) и написатьfor x downto 0 do printf("%d\n", x) done
о, человечество ...Ответы:
-->
не оператор. Это на самом деле два отдельных оператора,--
и>
.Код условного кода уменьшается
x
, возвращаяx
исходное (не уменьшенное) значение, а затем сравнивает исходное значение с0
использованием>
оператора.Чтобы лучше понять, заявление можно записать следующим образом:
источник
while (x-- > 0)
что было бы более подходящим. Это также делает более очевидным, что происходит (по крайней мере, в редакторе с фиксированным шрифтом), означая, что скобки в этом ответе не будут необходимы.Или для чего-то совершенно другого ...
x
слайды0
.Не так математично, но ... каждая картина рисует тысячу слов ...
источник
why waste words when a picture does a better job
, используемое в этом контексте как шутка. (есть на самом деле 2 ключевых словаwhile
иprintf
)Это очень сложный оператор, поэтому даже ISO / IEC JTC1 (Объединенный технический комитет 1) поместил свое описание в две разные части стандарта C ++.
Шутки в сторону, они представляют собой два разных оператора:
--
и>
описаны , соответственно , в §5.2.6 / 2 и §5.9 на C ++ 03 стандарта.источник
Это эквивалентно
x--
(после декремента) эквивалентноx = x-1
так, код преобразуется в:источник
0 >-- x
в этом случаеx
уменьшается до логики. В постфиксе логика выполняется перед уменьшением, и, таким образом, оба образца эквивалентны. Не стесняйтесь записывать их вConsole
и тестировать их.while(x=x-1,x+1 > 0)
эквивалентно.x
может пойти к нулю еще быстрее в обратном направлении:8 6 4 2
Вы можете контролировать скорость стрелкой!
90 80 70 60 50 40 30 20 10
;)
источник
Это
Просто пространство заставляет вещи выглядеть смешно,
--
уменьшать и>
сравнивать.источник
Использование
-->
имеет историческую значимость. Уменьшение было (и остается в некоторых случаях) быстрее, чем увеличение в архитектуре x86. Использование-->
предполагает, чтоx
собирается0
, и обращается к тем, у кого есть математическое образование.источник
Вот как это проанализировано.
источник
Совершенно отвратительный, но я буду использовать это:
источник
do ... while
является списком операторов. В С это блок, так и должно бытьdo { ... } while
.do statement while ( expression ) ;
. Сказав это, я надеюсь, что это поняли, я имел в виду пример как шутку.В одной книге, которую я прочитал (я не помню правильно, какая книга), говорилось: компиляторы пытаются анализировать выражения по самому большому токену , используя левое правое правило.
В этом случае выражение:
Разборы по самым большим токенам:
То же правило применяется к этому выражению:
После разбора:
Я надеюсь, что это помогает понять сложное выражение ^^
источник
a-----b
и подумает(a--)-- - b
, что не компилируется, потомуa--
что не возвращает lvalue.x
и--
есть два отдельных токена.-->
это оператор (что подразумевается под вопросом, который был задан), этот ответ вообще не полезен - вы будете думать, что маркер 2 --->
не просто--
. Если вы знаете, что-->
это не оператор, у вас, вероятно, нет проблем с пониманием кода в вопросе, поэтому, если у вас нет совершенно другого вопроса, я не совсем уверен, как это может быть полезно.a
перегружен оператор пост-декремента, который возвращает lvalue. coliru.stacked-crooked.com/a/e1effc351ae79e9fЭто точно так же, как
для неотрицательных чисел
источник
for(--x++;--x;++x--)
?unsigned
для--x++
имеет неопределенное поведение в соответствии с §1.9.15unsigned
, он бы использовал%u
В любом случае, у нас теперь есть оператор «идет».
"-->"
его легко запомнить как направление, и «пока х уходит в ноль» означает прямое значение.Кроме того, это немного более эффективно, чем
"for (x = 10; x > 0; x --)"
на некоторых платформах.источник
for (size_t x=10; x-->0; )
тело цикла выполняется с 9,8, .., 0, тогда как другая версия имеет 10,9, .., 1. В противном случае выйти из цикла с нуля с помощью переменной без знака довольно сложно.++>
чтобы сделать дополнительную работу.int
, так что он может так же легко съесть вашу собаку, какx
и обнулить, если она начинается отрицательно.0
. (Для сравнения, идиома пропуска тестов на ноль, таких как записьwhile (n--)
вместо «без знака»n
, ничего не покупает, и для меня сильно затрудняет читаемость.) Он также обладает приятным свойством указывать на один больше, чем начальный индекс, который обычно Вы хотите (например, для цикла над массивом вы указываете его размер). Мне также нравится-->
без места, так как это позволяет легко распознать идиому.Этот код сначала сравнивает x и 0, а затем уменьшает x. (Также сказано в первом ответе: вы после x уменьшаете, а затем сравниваете x и 0 с
>
оператором.) Смотрите вывод этого кода:Теперь мы сначала сравним, а затем уменьшим, увидев 0 в выводе.
Если мы хотим сначала уменьшить, а затем сравнить, используйте этот код:
Этот вывод:
источник
Мой компилятор распечатает 9876543210 при запуске этого кода.
Как и ожидалось. На
while( x-- > 0 )
самом деле означаетwhile( x > 0)
.x--
Пост декрементируетx
.это другой способ написать то же самое.
Приятно, что оригинал выглядит как «пока х уходит в 0».
источник
while( x-- > 0 ) actually means while( x > 0)
- Я не уверен, что вы пытались сказать там, но то, как вы это сформулировали, подразумевает, что не--
имеет никакого значения, что, очевидно, очень неправильно.x
будет-1
после того, как выйдет из цикла, а в этом ответеx
будет0
.Между
--
и>
. Отсутствует пробел .x
является пост уменьшенным, то есть уменьшенным после проверки условияx>0 ?
.источник
#define foo()
сравнении с#define foo ()
.--
является оператором декремента и>
является оператором больше, чем .Два оператора применяются как один, как
-->
.источник
Это комбинация двух операторов. Первый
--
- для уменьшения значения и>
для проверки, больше ли значение, чем правый операнд.Выход будет:
источник
На самом деле,
x
пост-декремент и с этим условием проверяется. Это не так-->
, это(x--) > 0
Примечание: значение
x
изменяется после проверки условия, потому что оно после уменьшения. Также могут возникнуть некоторые подобные случаи, например:источник
x
начнется с 1, ноwhile ( (x--) > 0 )
будет. {edit} Эрик Липперт освещал оба в своих заметках о выпуске C # 4: blogs.msdn.microsoft.com/ericlippert/2010/04/01/…C и C ++ подчиняются правилу "максимальное жевание". Точно так же, как a --- b переводится
(a--) - b
, в вашем случаеx-->0
переводится как(x--)>0
.По сути, это правило говорит о том, что при движении слева направо выражения формируются путем взятия максимального количества символов, которые образуют правильное выражение.
источник
Почему все осложнения?
Простой ответ на оригинальный вопрос просто:
Делает то же самое. Я не говорю, что вы должны делать это так, но он делает то же самое и ответил бы на вопрос в одном посте.
Это
x--
просто сокращение для вышеупомянутого, и>
просто нормальное значение больше, чемoperator
. Нет большой загадки!Сейчас слишком много людей делают простые вещи сложными;)
источник
The OP's way: 9 8 7 6 5 4 3 2 1 0
иThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
x=x-1
раньше,printf
тогда вы можете сказать, что он делает то же самое.Традиционным образом мы определяем условие в
while
скобках цикла()
и условие завершения внутри фигурных скобок{}
, но-->
определяем оба сразу.Например:
Это уменьшает
a
и запускает цикл, покаa
больше, чем0
.Условно это будет выглядеть так:
В обоих направлениях мы делаем одно и то же и достигаем одинаковых целей.
источник
test-write-execute
как в вопросе, спасибо за указание!(x --> 0)
средства(x-- > 0)
(x -->)
output -: 9 8 7 6 5 4 3 2 1 0
(-- x > 0)
Это значит(--x > 0)
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
Кроме того, вы можете попробовать много методов, чтобы успешно выполнить эту команду
источник