” operatörü nedir?'/> ” operatörü nedir?'/> ” operatörü nedir?'/> C ++ 'da “->” operatörü nedir? | tutuappapks.com

Soru C ++ 'da “->” operatörü nedir?


Okuduktan sonra Gizli Özellikler ve C ++ / STL'nin Karanlık Köşeleri üzerinde comp.lang.c++.moderatedAşağıdaki parçacıkların hem Visual Studio 2008'de hem de G ++ 4.4'te derlendiğini ve çalıştığını tümüyle şaşırdım.

İşte kod:

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

Ben de GCC'de çalıştığı için bunun C olduğunu varsayalım. Bu standartta nerede tanımlanmış ve nereden geldi?


7782


Menşei


Ya da sadece uygun bir boşluk ... Değişken ile arasında bir boşluk gördüğümü sanmıyorum. ++ veya -- önce... - Matthew Scharley
Bu "gider" operatörü geri alınabilir (0 <- x). Ve ayrıca bir "çalışır" operatörü (0 <---- x) var. Geez, şimdiye kadar duyduğum en komik şey c ++ syntax =) +1 soru için. - SadSido
Gerçekten de, yorumlama çok yanlış olmasına rağmen, kodun doğru olarak ne yaptığını açıklar. :) - Noldorin
Yeni sözdizimi olasılıklarını hayal edin: #define upto ++<, #define downto -->. Kötülük hissediyorsan, yapabilirsin #define for while( ve #define do ) { (ve #define done ;}) ve yaz for x downto 0 do printf("%d\n", x) done Ah insanlık... - Chris Lutz
Tamamen yeni bir kodlama yolu olasılığını açar, bir kaç derleyici uyarısı için fedakarlık yapmaya değer: bool CheckNegative (int x) {return x <0? doğru yanlış ); } - ttt


Cevaplar:


--> operatör değildir. Aslında iki ayrı operatör, -- ve >.

Şartın kod azaltımları xdönerken xorijinal (azaltılmamış) değeri ve daha sonra orijinal değeri ile karşılaştırır. 0 kullanmak > Şebeke.

Daha iyi anlamak için ifade şu şekilde yazılabilir:

while( (x--) > 0 )

7479



Sonra tekrar, bu bağlamda bir çeşit menzil operatörü gibi görünüyor. - Charles Salvia
X'in azaldığını ve sonra 0 ile karşılaştırılmasının x'in 0 ile kıyaslandıktan sonra azaldığını söylemesi de aynıdır. - Charles Salvia
Java'da da derler :) - Steven Devijver
Bunun adı @Jay, kötü programlama tarzıdır :-) Bu, sorunun ilk sırada sorulması gerçeğiyle kanıtlanmıştır. Operatörleri, birbirleriyle alakasız bir şey yerine, faaliyette bulundukları şeye, metinsel olarak bağlamalarını çok daha anlamlı hale getirir. while (x-- > 0) daha uygun olurdu. Ayrıca, bu cevabın parantezlerinin gerekli olmayacağı anlamına gelen (en azından sabit font editöründe) neler olup bittiğini daha açık hale getirir. - paxdiablo
Yani "->" operatörünü açıklamak için "((" operatör ve "-)>" operatörünü kullanmak zorundasınız? - Ira Baxter


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

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

Bu kadar matematiksel değil, ama ... her resim bin sözcük çiziyor. ...


2382



Üzgünüm, bunu anlamadım. Bu nasıl çalışıyor? - mafu
@mafutrct - Hatırladığım gibi, C de bir satır sonu olmayan bir sonraki satırı ekler. Buradakiler temelde hiçbir şey yapmıyor. - Hogan
IIRC, K & R C, '-' eksiltme operatöründeki boşluklar arasında bir boşluk bıraktı, bu durumda, ortasında daha da soğuk görünen ters eğik çizgi olabilirdi. :) - Jules
@ArnavBorborah bu eski bir anlam ifade why waste words when a picture does a better job Bu bağlamda bir şaka olarak kullanılmıştır. (aslında 2 anahtar kelime var while ve printf ) - unsynchronized
Ah evet, karanlık slayt operatörü. Nasıl unutabilirim! - demonkoryu


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

Bir kenara şaka, onlar iki farklı işleç vardır: -- ve > sırasıyla C ++ 03 Standardının §5.2.6 / 2 ve §5.9'unda açıklanmıştır.


2221





Bu eşdeğerdir

while (x-- > 0)

1142



Bu, birçok kişinin kodu anlamasına yardımcı olabilse de, bunu açıklamak için birkaç satır faydalı olacaktır. - Dukeling
@Dukeling x-- kısa el gösterimi x-1 - Albert Renshaw
@AlbertRenshaw Yanıtladığınız yıllık yorumların, tek bir operatör olmadığına dair bir açıklama, bunun yerine karışıklık modeline yerleştirilen iki operatörün yararlı olabileceğinden eminim. - mah
@ mbomb007 Üzgünüm, x- = 1 demek istedim - geç haha ​​geçti - Albert Renshaw
@AlbertRenshaw ama x -= 1 ve x-- aynı değil ... Eğer böyle yazmak istiyorsanız o zaman while (x >= 0) { x -= 1; } - Krzysztof Karski


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

int x = 10;

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

8 6 4 2

Bir ok ile hızı kontrol edebilirsiniz!

int x = 100;

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

90 80 70 60 50 40 30 20 10

;)


861



hangi işletim sistemi, üretilen bu tür bir hata mesajı vardı bir ubuntu 12.04 kullanıyorum - Bhuvanesh
Her ne kadar C ++ 'da bunu okuyan herkese açık olmalıydı, bunu yapmayın. Birden fazla arttırma / azaltma ihtiyacınız varsa, yalnızca artırılmış ödevi kullanın. - Blimeo
"Lazerler" ile sıfır. (0> - - - - - - - - - - ---------- x) ... aynı çıktı. - Samuel Danielson
@phord derlemediğinden emin misin? -> coliru.stacked-crooked.com/a/5aa89a65e3a86c98 - doc
@doc c ++ 'da derler ama c cinsinden değil. - phord


Onun

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

Sadece alan şeyler komik görünmek -- azalmalar ve > karşılaştırır.


498





Kullanımı --> tarihsel geçerliliği vardır. Azaltma, x86 mimarisinde artıştan daha hızlıydı (ve bazı durumlarda hala). kullanma --> bunu önerdi x gidiyor 0ve matematiksel geçmişe sahip olanlara hitap eder.


372



Tam olarak doğru değil. Yavaşlama ve Arttırma aynı zaman alır, bunun yararı, sıfır ile karşılaştırmanın, bir değişkene kıyasla karşılaştırmaya kıyasla çok hızlı olmasıdır. Bu sadece x86 için değil, birçok mimaride geçerlidir. Bir JZ komutu ile herhangi bir şey (sıfır ise atlayın). Çevrenizde dolaşmak, karşılaştırmada döngüleri kaydetmek için geriye doğru yazılmış birçok "for" döngüsü bulabilir. Bu, x86'da, sıfır işaretini uygun bir şekilde ayarlayan değişkenin azaltılması eylemi olarak özellikle hızlıdır, bu nedenle, değişkeni açıkça karşılaştırmak zorunda kalmadan şube kurabilirsiniz. - burito
Eh, sıfıra doğru azaltma, her yineleme ile n'yi karşılaştırmak için n'ye doğru yineleme yaparken, sadece döngü başına yineleme ile karşılaştırmanız gerektiği anlamına gelir. Birincisi daha kolay olma eğilimindedir (ve bazı mimarilerde, her veri kayıt işleminden sonra otomatik olarak test edilir). - Joey Adams
@burrito Ben katılmıyorum rağmen, sıfır olmayan değerler üzerinde koşullandırılmış döngüler genellikle mükemmel yakın tahmin edilir. - Duncan
Arttırma ve eksiltme, muhtemelen tüm platformlarda (kesinlikle x86'da) eşit derecede hızlıdır. Fark, döngü sonu koşulunu test etmektir. Sayacın sıfıra ulaşıp ulaşmadığını pratik olarak ücretsiz olarak görmek için - bir değeri düşürdüğünüzde, işlemcide sıfır bayrağı ayarlanmış ve son durumu tespit etmek için yalnızca bu bayrağı kontrol etmeniz gerekir, oysa bir sonlandırma koşulu artırmadan önce bir karşılaştırma işlemi gerektiğinde tespit edilebilir. - lego
Elbette, modern derleyiciler bu döngüyü otomatik olarak düzenleyebiliyor ve tersine çevirebileceğinden, tüm bunlar günlerdir. - Lambda Fairy


while( x-- > 0 )

Bu nasıl ayrıştırıldı.


324





Tamamen geek 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;
}

292



Umarım hiç bir zaman kaynak kodunuza rastlamam… - mk12
@ Mk12 Bu kaynak kod değil ... hiyeroglif :-) - raffian
@SAFX - Mükemmel hiyeroglif olurdu mısır parantezleri - mouviciel
Bu derleme değil. C Pascal değil, iç do ... while bir açıklama listesi. C'de bir blok, bu yüzden olmalı do { ... } while. - user207421
@EJP derleme yapar. Sözdizimi do statement while ( expression ) ;. Bunu söylemiş olsaydım, umarım anlaşıldığı gibi bir şaka örneği. - Escualo


Okuduğum bir kitap (Hangi kitabı doğru hatırlamıyorum): Derleyiciler en büyük belirtecin ifadelerini ayrıştırmaya çalışır. sol sağ kuralı kullanarak.

Bu durumda, ifade:

x-->0

En büyük jetonları ayrıştırır:

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

Aynı kural bu ifadeye uygulanır:

a-----b

Ayrıştırıldı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 ^^


283



İkinci açıklaman doğru değil. Derleyici görecek a-----b ve düşün (a--)-- - b, çünkü derleme değil a-- bir değer döndürmez. - Tim Leaf
Bunlara ek olarak, x ve -- iki ayrı simge vardır. - Roland Illig
Bu bilinen Maksimum munch. - RJFalconer
@DoctorT: lexer'ı geçer. sadece semantik geçiş bu hatayı verebilir. onun açıklaması doğru. - v.oddou
Düşündüğün sürece --> bir operatördür (sorulan soruya sahip olmanın ima ettiği şey), bu cevap hiç de yararlı değildir. -->değil, sadece --. Bunu biliyorsan --> bir operatör değil, muhtemelen sorunda kodu anlamakta sorun yaşamayacaksınız, bu yüzden tamamen farklı bir sorunuz olmadıkça, bunun nasıl faydalı olabileceğinden emin değilim. - Dukeling


Bu tam olarak aynı

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

negatif olmayan sayılar için


241



@DoctorT "negatif olmayan" demek istiyorsunuz.
Bu olmamalı for(--x++;--x;++x--)? - Mateen Ulhaq
@DoctorT bu ne unsigned için - Cole Johnson
@MateenUlhaq, bu standart ifadeye göre yanlış --x++ §1.9.15'e göre tanımlanmamış davranışa sahiptir - WorldSEnder