Qual é o operador "->" em C ++?

Depois de ler Hidden Features e Dark Corners de C ++ / STL em comp.> , fiquei completamente surpreso com o seguinte trecho compilado e trabalhado no Visual Studio 2008 e no g ++ 4.4.

Aqui está o código:

 #include <stdio.h> int main() { int x = 10; while (x --> 0) // x goes to 0 { printf("%d ", x); } } 

Eu sugeriria que este é C, como funciona no GCC. Onde é definido no padrão e de onde vem?

8054
29 окт. definido por GManNickG 29 de outubro . 2009-10-29 09:57 '09 at 9:57 am 2009-10-29 09:57
@ 25 respostas

--> não --> um operador. Na verdade, esses são dois operadores separados, e > .

Um código condicional reduz o valor de x retornando o valor original (não reduzido) de x e, em seguida, compara o valor original com 0 usando o operador > .

Para entender melhor a expressão pode ser escrito da seguinte forma:

 while( (x--) > 0 ) 
7743
29 окт. resposta dada a Charles Salvia em 29 de out 2009-10-29 10:00 '09 às 10:00 2009-10-29 10:00

Ou para algo completamente diferente ... x desliza para 0

 while (x --\ \ \ \ > 0) printf("%d ", x); 
border=0

Não tão matematicamente, mas ... cada quadro atrai mil palavras ...

2564
18 янв. a resposta é dada não sincronizada 18 de janeiro 2012-01-18 14:18 '12 às 14:18 2012-01-18 14:18

Este é um operador muito complexo, por isso mesmo o ISO / IEC JTC1 (Comitê Técnico Conjunto 1) colocou sua descrição em duas partes diferentes do Padrão C ++.

Brincando ao lado, estes são dois operadores diferentes: -- e > , descritos respectivamente na seção 5.2.6 / 2 e na seção 5.9 do padrão C ++ 03.

2265
29 окт. a resposta é dada por Kirill V. Lyadvinsky em 29 de outubro. 2009-10-29 11:38 '09 às 11:38 am 2009-10-29 11:38

Isso é equivalente a

 while (x-- > 0) 

x-- (após decremento) é equivalente a x = x-1 então o código é convertido para:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. A resposta é dada por Jay Riggs em 29 de outubro. 2009-10-29 10:00 '09 às 10:00 2009-10-29 10:00

x pode ir a zero ainda mais rápido na direção oposta:

 int x = 10; while( 0 <---- x ) { printf("%d ", x); } 

8 6 4 2

Você pode controlar a velocidade com a flecha!

 int x = 100; while( 0 <-------------------- x ) { printf("%d ", x); } 

90 80 70 60 50 40 30 20 10

;)

961
28 дек. A resposta é dada doc 28 dezembro 2014-12-28 03:32 '14 às 3:32 2014-12-28 03:32

É

 #include <stdio.h> int main(void){ int x = 10; while( x-- > 0 ){ // x goes to 0 printf("%d ", x); } return 0; } 

Apenas o espaço torna as coisas divertidas, diminui e compara.

513
29 окт. a resposta é dada RageZ 29 oct. 2009-10-29 10:00 '09 às 10:00 2009-10-29 10:00

Use --> tem significado histórico. Decrementar foi (e ainda é, em alguns casos) mais rápido do que incrementar a arquitetura x86. Usando --> , suponha que x aproxima de 0 e se refira àqueles que possuem um background matemático.

380
18 нояб. A resposta é dada por Matt Joiner em 18 de novembro. 2009-11-18 15:47 '09 às 15:47 2009-11-18 15:47
 while( x-- > 0 ) 

como é analisado.

332
29 окт. Resposta dada por Grumdrig 29 de outubro. 2009-10-29 10:00 '09 às 10:00 2009-10-29 10:00

Totalmente geek, mas vou usar isso:

 #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; } 
310
18 мая '10 в 23:33 2010-05-18 23:33 a resposta é dada por Escualo em 18 de maio de 2010 às 23:33 2010-05-18 23:33

Um livro que li (não me lembro de qual livro foi) afirmou: Os compiladores tentam analisar as expressões no maior token usando a regra da esquerda para a esquerda.

Neste caso, a expressão:

 x-->0 

Parsis para os maiores tokens:

 token 1: x token 2: -- token 3: > token 4: 0 conclude: x-- > 0 

A mesma regra se aplica a esta expressão:

 a-----b 

Após a análise:

 token 1: a token 2: -- token 3: -- token 4: - token 5: b conclude: (a--)-- - b 

Espero que isso ajude a entender a expressão complexa ^^

291
09 апр. a resposta é dada por NguyenDat 09 abr 2010-04-09 03:04 '10 às 3:04 2010-04-09 03:04

É exatamente o mesmo que

 while (x--) { printf("%d ", x); } 

para números não negativos

246
31 дек. A resposta é dada por Good Person em 31 de dezembro. 2009-12-31 16:48 '10 às 16:48 2009-12-31 16:48

De qualquer forma, agora temos um operador "vindo". "-->" fácil de lembrar como uma direção, e "enquanto x desaparece" significa "simples".

Além disso, é um pouco mais eficiente do que "for (x = 10; x > 0; x --)" em algumas plataformas.

224
29 окт. Resposta dada Teste 29 de outubro. 2009-10-29 17:45 '09 às 17:45 2009-10-29 17:45

Esse código primeiro compara xe 0 e, em seguida, diminui x. (Além disso, a primeira resposta diz: você pós-decrementa x e, em seguida, compara x e 0 com o operador > .) Consulte a saída deste código:

 9 8 7 6 5 4 3 2 1 0 

Agora, primeiro comparamos e depois diminuímos, vendo 0 na saída.

Se quisermos primeiro reduzir e comparar, use este código:

 #include <stdio.h> int main(void) { int x = 10; while( --x> 0 ) // x goes to 0 { printf("%d ", x); } return 0; } 

Essa conclusão:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. A resposta é dada por Sajad Bahmani 18 de novembro 2009-11-18 15:52 '09 às 15:52 2009-11-18 15:52

Meu compilador imprimirá 9876543210 quando você executar esse código.

 #include <iostream> int main() { int x = 10; while( x --> 0 ) // x goes to 0 { std::cout << x; } } 

Como esperado. O valor while( x-- > 0 ) significa while( x > 0) . x-- pós-decrementos x .

 while( x > 0 ) { x--; std::cout << x; } 

- Esta é outra maneira de escrever a mesma coisa.

É legal que o original pareça "enquanto x vai para 0".

160
17 янв. a resposta é dada cool_me5000 17 jan. 2010-01-17 03:46 '10 às 3:46 2010-01-17 03:46

Não há espaço entre -- e > . x post é diminuído, ou seja, diminui depois de verificar a condição x>0 ? .

133
a resposta é dada ao Sr. 28 дек. X 28 dez 2009-12-28 19:32 '10 às 19:32 2009-12-28 19:32

-- - operador decrement , e > - operator more .

Dois operadores são aplicados como um, por exemplo --> .

124
06 апр. resposta sam 06 abr. 2010-04-06 13:45 '10 às 13:45 2010-04-06 13:45

Esta é uma combinação de dois operadores. O primeiro destina-se a reduzir o valor e > a verificar se o valor é maior que o operando direito.

 #include<stdio.h> int main() { int x = 10; while (x-- > 0) printf("%d ",x); return 0; } 

A saída será:

 9 8 7 6 5 4 3 2 1 0 
117
02 апр. Resposta dada por Rajeev Das 02 abr. 2013-04-02 14:22 '13 às 2:22 pm 2013-04-02 14:22

Na verdade, x pós-decrementado e essa condição é verificada. Não é --> , (x--) > 0

Nota: o valor de x muda após a verificação da condição, uma vez que é pós-decrementada. Alguns casos semelhantes também podem ocorrer, por exemplo:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. A resposta é dada pelo AndroidLearner 18 ago. 2012-08-18 10:34 '12 às 10:34 am 2012-08-18 10:34

C e C ++ seguem a regra "maximum munch". Assim como --- b é traduzido para (a--) - b , no seu caso x-->0 traduzido para (x--)>0 .

O que a regra essencialmente diz é que o movimento da esquerda para a direita, expressões são formadas pela adoção de um máximo de símbolos que formarão a expressão correta.

105
10 февр. A resposta é dada por Pandrei 10 de fevereiro 2014-02-10 20:29 '14 às 20:29 2014-02-10 20:29

Por que todas as complicações?

Uma resposta simples para a pergunta original:

 #include <stdio.h> int main() { int x = 10; while (x > 0) { printf("%d ", x); x = x-1; } } 

Faz a mesma coisa. Não dizendo que você deveria fazer assim, mas ele faz o mesmo e responderia a uma pergunta.

x-- é apenas um atalho para o acima, e > é apenas mais normal que o operator x-- . Não há grandes segredos!

Há muitas pessoas fazendo coisas simples no momento;)

23
27 окт. A resposta é dada Garry_G 27 de outubro. 2016-10-27 18:09 '16 às 6:09 pm 2016-10-27 18:09

De maneira usual, definimos a condição entre parênteses do laço " () " e a condição de terminação dentro das chaves " {} ", mas isso e > é o modo como todos definem tudo de uma só vez. Por exemplo, por exemplo:

 int abc(){ int a = 5 while((a--) > 0){ // Decrement and comparison both at once // Code } } 

Diz, reduz ae inicia o ciclo até que o tempo a maior que 0

Outra maneira que deveria ter sido:

 int abc(){ int a = 5 while(a > 0){ // Code a = a -1 // Decrement inside loop } } 

nos dois sentidos, fazemos o mesmo e atingimos os mesmos objetivos.

20
28 мая '17 в 23:10 2017-05-28 23:10 a resposta é dada Zohaib Ejaz 28 de maio de '17 às 23:10 2017-05-28 23:10

C / C ++ ignora espaços com condição. Essencialmente, o código

 while (x --> 0) 

é o mesmo que

 while (x-- > 0) 

ou

 while(x > 0){ x = x - 1 ... 

Usando pós-decremento em condição. Vamos dizer x = 10 . O operador de condição será 10>0 e printf("%d ", x); o operador no loop dará 9 na primeira execução. Para a segunda execução, a condição será 9>0 e a vedação será igual a 8 e assim por diante até a condição 0>0 .

0
06 сент. a resposta é dada Zirc 06 set. 2018-09-06 00:20 '18 às 0:20 2018-09-06 00:20

--> é basicamente a mesma coisa que:

  for(x=10; x<1; ++x) cout<<x 

você encontra todos os números entre xe o número dado.

-1
Resposta dada por Aleks. 14 апр. S. abr 14 2018-04-14 21:59 '18 às 21:59 2018-14-14 21:59

Se você tivesse que escrever uma função para fazer o contrário, a sintaxe é muito mais óbvia, sem mencionar que eu não acho que tenha visto isso antes:

  #include <stdio.h> int main() { int x {10}; while (x ++< 20) // x increments to 20 { printf("%d ", x); } } 

Resultado:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee respondeu 13 de julho '18 às 18:34 2018-07-13 18:34

Na verdade → não um operador. Esta é uma combinação de dois operadores separados - e>

Vamos dar um exemplo. Enquanto (x → 0) Esta é uma expressão confidencial com uma confirmação. Aqui, o primeiro x é o decremento com seu valor e, em seguida, comparado a 0.

-4
06 дек. Resposta dada por Lovekush Vishwakarma Dez 06 2017-12-06 16:45 '17 às 16:45, 2017-12-06 16:45

Outras questões sobre tags or Faça uma pergunta