C ++ 'da "->" işleci nedir?

comp.> Gizli Özellikler ve C ++ / comp.> Karanlık Köşeleri'ni okuduktan sonra, aşağıdaki pasajın hem Visual Studio 2008 hem de g ++ 4.4 uygulamasında derlenmesi ve çalışılması beni şaşırttı.

İşte kod:

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

Bunun GCC'de çalıştığı gibi C olduğunu söyleyebilirim. Standartta nerede tanımlanmaktadır ve nereden geliyor?

8054
29 окт. GManNickG 29 ek. 2009-10-29 09:57 '09, 09:57, 2009-10-29 09:57
@ 25 cevap

--> bir operatör değil. Aslında, bunlar iki ayrı operatördür, -- ve > .

Koşullu bir kod, x orijinal (azaltılmamış) değerini döndürerek x değerini azaltır ve > operatörünü kullanarak orijinal değeri 0 ile karşılaştırır.

İfadeyi daha iyi anlamak için şu şekilde yazılabilir:

 while( (x--) > 0 ) 
7743
29 окт. 29 Ekim tarihinde Charles Salvia'ya verilen cevap 2009-10-29 10:00 '09, 10:00 2009-10-29 10:00

Veya tamamen farklı bir şey için ... x 0'a kayar

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

O kadar matematiksel değil, ama ... her resim bin kelime çizer ...

2564
18 янв. cevap senkronize edilmemiş 18 Ocak verildi 2012-01-18 14:18 '12, 14:18 2012-01-18 14:18

Bu çok karmaşık bir operatördür, dolayısıyla ISO / IEC JTC1 (Ortak Teknik Komite 1) bile tanımını C ++ Standardının iki farklı bölümüne yerleştirmiştir.

Şaka olarak, bunlar iki farklı operatördür: -- ve > , sırasıyla bölüm 5.2.6 / 2'de ve C ++ 03 standardının 5.9 bölümünde açıklanmıştır.

2265
29 окт. Cevap 29 Ekim'de Kirill V. Lyadvinsky tarafından verildi . 2009-10-29 11:38 '09, 11:38, 2009-10-29 11:38

Bu eşdeğerdir

 while (x-- > 0) 

x-- ( x-- sonra) x = x-1 eşdeğerdir x = x-1 bu nedenle kod şuna dönüştürülür:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. Cevap Jay Riggs tarafından 29 Ekim'de verildi. 2009-10-29 10:00 '09, 10:00 2009-10-29 10:00

x ters yönde daha hızlı sıfıra gidebilir:

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

8 6 4 2

Hızı ok ile kontrol edebilirsiniz!

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

90 80 70 60 50 40 30 20 10

;)

961
28 дек. Cevap 28 Aralık'ta verilir . 2014-12-28 03:32 '14 3: 32'de 2014-12-28 03:32

Bu

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

Sadece boşluk işleri eğlenceli hale getirir, azaltır ve > karşılaştırır.

513
29 окт. Cevap RageZ 29 ekim. 2009-10-29 10:00 '09, 10:00 2009-10-29 10:00

Kullan --> tarihi bir öneme sahiptir. Azalma (ve bazı durumlarda hala) x86 mimarisini artırmaktan daha hızlıydı. --> kullanarak, x 0 yaklaştığını ve matematiksel arka planı olanları ifade ettiğini varsayalım.

380
18 нояб. Cevap Matt Joiner tarafından 18 Kasım'da verildi. 2009-11-18 15:47 '09, 15:47 2009-11-18 15:47
 while( x-- > 0 ) 

nasıl analiz edildiğini.

332
29 окт. Cevap 29 Ekim Grumdrig tarafından verildi . 2009-10-29 10:00 '09, 10:00 2009-10-29 10:00

Tamamen inek ama bunu kullanacağım:

 #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 Cevap, Escualo tarafından 18 Mayıs 10'da 23 : 33'te verildi 2010-05-18 23:33

Okuduğum bir kitap (hangi kitabın olduğunu hatırlamıyorum) belirtildi: Derleyiciler , soldaki kuralı kullanarak ifadeleri en büyük belirteçte ayrıştırmaya çalışıyorlar .

Bu durumda, ifade:

 x-->0 

En büyük belirteçler için parantez:

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

Aynı kural bu ifade için de geçerlidir:

 a-----b 

Ayrıştırdıktan sonra:

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

Umarım bu karmaşık ifadeyi anlamaya yardımcı olur ^^

291
09 апр. Cevap NguyenDat tarafından verildi 09 Nis 2010-04-09 03:04 '10, 03:04 2010-04-09 03:04

Tam olarak aynı

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

negatif olmayan numaralar için

246
31 дек. Cevap 31 Aralık'ta İyi Kişi tarafından verilir. 2009-12-31 16:48 '10 16:48, 2009-12-31 16:48

Her durumda, şimdi "gel" adlı bir operatörümüz var. "-->" bir yön olarak hatırlamak kolaydır ve "x sıfıra giderken" "basit" anlamına gelir.

Ayrıca, bazı platformlarda "for (x = 10; x > 0; x --)" den biraz daha verimlidir.

224
29 окт. verilen cevap 29 Ekim. 2009-10-29 17:45 '09, 17:45 2009-10-29 17:45

Bu kod önce x ve 0'ı karşılaştırır, sonra x'i azaltır. (Ayrıca, ilk cevap diyor ki: x 'i azalttıktan sonra x ve 0'ı > operatörü ile karşılaştır.) Bu kodun çıktısına bakınız:

 9 8 7 6 5 4 3 2 1 0 

Şimdi önce karşılaştırıp sonra azaldık, çıktıda 0'ı görüyoruz.

Öncelikle küçültüp karşılaştırmak istiyorsak şu kodu kullanın:

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

Bu sonuç:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. Cevap Sajad Bahmani 18 Kasım'da verildi. 2009-11-18 15:52 '09, 15:52 2009-11-18 15:52

Bu kodu çalıştırdığınızda derleyicim 9876543210 yazdıracak.

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

Beklendiği gibi. while( x-- > 0 ) while( x > 0) . x-- azalma sonrası x .

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

- Aynı şeyi yazmanın başka bir yolu bu.

Orijinalin "x 0'a giderken" gibi görünmesi çok hoş.

160
17 янв. Cevap verilmiştir cool_me5000 17 jan. 2010-01-17 03:46 '10, 03:46 2010-01-17 03:46

-- ve > arasında boşluk yoktur. x Gönderi azaltılır, yani durumu kontrol ettikten sonra azalır x>0 ? .

133
Cevap Bay tarafından verilir. 28 дек. X 28 Aralık 2009-12-28 19:32 '10, 19:32 2009-12-28 19:32

-- - operatör azaltma ve > - operatör daha fazla .

İki operatör tek olarak uygulanır, örneğin --> .

124
06 апр. cevap 06 06 nisan. 2010-04-06 13:45 '10, 13:45 2010-04-06 13:45

Bu iki operatörün bir kombinasyonudur. Birincisi, değeri düşürmek ve > değerin sağ işlenenden daha büyük olup olmadığını kontrol etmek için tasarlanmıştır.

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

Çıkış:

 9 8 7 6 5 4 3 2 1 0 
117
02 апр. Cevap. Cevap Rajeev Das 02 Apr. 2013-04-02 14:22 13 : 02: 22'de 2013-04-02 14:22

Aslında, x azaltılmış ve bu durum kontrol edilir. O değil --> , o (x--) > 0

Not: Durumu kontrol ettikten sonra x değeri azalır, çünkü azalır. Bazı benzer durumlar da ortaya çıkabilir, örneğin:

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. Cevap AndroidLearner 18 Ağustos tarafından verilir . 2012-08-18 10:34 '12, 10:34, 2012-08-18 10:34

C ve C ++ "maksimum munch" kuralını izler. Tıpkı --- b'nin (a--) - b çevrilmesi durumunda, x-->0 (x--)>0 çevrilir.

Kuralın esasen söylediği, soldan sağa doğru olan hareketin, ifadelerin doğru ifadeyi oluşturacak maksimum karakterleri benimseyerek oluşturulmasıdır.

105
10 февр. Cevap Pandrei tarafından 10 Şubat'ta verilir. 2014-02-10 20:29 '14, 20:29 2014-02-10 20:29

Neden tüm komplikasyonlar?

Orijinal soruya basit bir cevap:

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

Aynı şeyi yapar. Bunu böyle yapman gerektiğini söylememekle aynı şeyi yapıyor ve bir soruya cevap verecek.

x-- yukarıdakiler için sadece bir kestirmedir ve > x-- operator daha normaldir. Büyük sır yok!

Şu anda basit şeyler yapan çok fazla insan var;)

23
27 окт. Cevap 27 Garry_G . 2016-10-27 18:09 '16, 6:09 pm 2016-10-27 18:09

Her zamanki gibi, " () " döngüsünün parantezindeki koşulu ve " {} " parantez içindeki sonlandırma koşulunu tanımlarız, ancak bu ve > herkesin her şeyi bir kerede tanımlamasıdır. Örneğin, örneğin:

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

A'nın azaldığı ve a'nın 0 büyük olduğu zamana kadar çevrimi başlattığı yazıyor.

Olması gereken başka bir yol:

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

Her iki yönde de aynı şeyi yapar ve aynı hedeflere ulaşırız.

20
28 мая '17 в 23:10 2017-05-28 23:10 Cevap Zohaib Ejaz 28 Mayıs 19, 23:10 2017-05-28 23:10 tarihinde veriliyor.

C / C ++, koşullu boşlukları yok sayar. Temel olarak, kod

 while (x --> 0) 

aynı

 while (x-- > 0) 

veya

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

Durumda azaltma sonrası kullanma. Diyelim ki x = 10 . Koşul operatörü 10>0 ve printf("%d ", x); döngüdeki operatör ilk çalıştırmada 9 değerini verecektir. İkinci çalıştırmada, durum 9>0 olacak ve conta 8 eşit olacak ve 0>0 koşuluna kadar devam edecektir.

0
06 сент. Cevap Zirc 06 Eylül. 2018-09-06 00:20 '18, 0:20 2018-09-06 00:20

--> temelde aynı şey:

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

x ile verilen numara arasındaki tüm sayıları bulursunuz.

-1
Cevap Aleks tarafından verildi . 14 апр. S. 14 Nisan 2018-04-14 21:59 '18, 21:59, 2018-14-14 21:59

Tersini yapmak için bir işlev yazmak zorunda kalırsanız, sözdizimi daha açıktır, daha önce görmediğimi sanmıyorum.

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

sonuç:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee 13 Temmuz 1918, 18: 34'te 2018-07-13 18:34 tarihinde yanıtladı.

Aslında → bir operatör değil. Bu iki ayrı operatörün birleşimidir - ve>

Bir örnek alalım. While (x → 0) Bu bir onay ile gizli bir ifadedir. Burada, ilk x değeri ile olan azalmadır ve ardından 0 ile karşılaştırılır.

-4
06 дек. Tarafından verilen cevap Lovekush Vishwakarma 06 Aralık 2017-12-06 16:45 '17, 16:45, 2017-12-06 16:45

etiketleri ile ilgili diğer sorular veya bir soru sorun