Что такое "-->" оператор в C++?
после прочтения скрытые функции и темные углы C++ / STL on 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. Где это определено в стандарте, и откуда оно взялось?
21 ответов
условное пообратите внимание
-->
не является оператором. Это фактически два отдельных оператора,--
и>
.
x
, когда они возвращались x
исходное (не уменьшенное) значение, а затем сравнивает исходное значение с 0
С помощью >
оператора.
чтобы лучше понять, заявление может быть написано следующим образом:
while((x--) > 0)
или для чего-то совершенно другого... х упал до 0
while (x --\
\
\
\
> 0)
printf("%d ", x);
не так математически, но... каждая картина рисует тысячу слов. ...
Это очень сложный оператор, поэтому даже ISO / IEC JTC1 (Объединенный технический комитет 1) разместил его описание в двух разных частях стандарта C++.
шутки в сторону, это два разных оператора:--
и >
описано соответственно в §5.2.6 / 2 и §5.9 стандарта C++03.
Это эквивалентно
while (x-- > 0)
x--
(post decrement) эквивалентно x = x-1
Итак, код преобразуется в:
while(x > 0) {
// logic
x = x-1;
}
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
, и обращается к тем, кто имеет математическое образование.
совершенно выродок, но я буду использовать этот:
#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
Я надеюсь, что это поможет понять сложное выражение ^^
в любом случае, теперь у нас есть оператор" идет к". "-->"
легко запоминается как направление, а "в то время как 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;
}
}
как и ожидалось. The while( x-- > 0 )
на самом деле означает while( x > 0)
. The x--
пост декремента x
.
while( x > 0 )
{
x--;
std::cout << 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
зачем все эти сложности?
простой ответ на первоначальный вопрос просто:
#include <stdio.h>
int main()
{
int x = 10;
while (x > 0)
{
printf("%d ", x);
x = x-1;
}
}
делает то же самое. Не говорю, что вы должны сделать, это так, но он делает то же самое и ответил бы на вопрос в одном посте.
на x--
это просто стенография для вышесказанного, и >
просто нормальный больше, чем operator
. Никакой большой тайны!
в наши дни слишком много людей усложняют простые вещи;)
обычным способом мы определяем условие в круглой скобке while"()
"и завершая условие внутри расчалок"{}
", но --
& >
это способ определить все сразу.
Для Эл.г:
int abc(){
int a = 5
while((a--) > 0){ // Decrement and comparison both at once
// Code
}
}
он говорит, декремент a
и запустить цикл до времени a
больше 0
другой путь это должно было быть так:
int abc(){
int a = 5
while(a > 0){
// Code
a = a -1 // Decrement inside loop
}
}
в обоих случаях мы делаем одно и то же и достигаем одних и тех же целей.