C++ 'da ÔÇť->ÔÇŁ operat├Âr├╝ nedir?


Al─▒nan cevaba git


Okuduktan sonra Gizli ├ľzellikleri ve C ++ / STL Dark Corners ├╝zerine comp.lang.c++.moderated , tamamen a┼ča─č─▒daki derlenmi┼č ve Visual Studio 2008 ve G ++ 4.4 hem ├žal─▒┼čt─▒ snippet'ine oldu─ču ┼ča┼č─▒rd─▒.

─░┼čte kod:

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

Bunun C oldu─čunu kabul ediyorum, ├ž├╝nk├╝ GCC'de de ├žal─▒┼č─▒yor. Bu, standartta nerede tan─▒mlanmaktad─▒r ve nereden gelmi┼čtir?


8538









Cevap say─▒s─▒n─▒ say: 22






--> bir operat├Âr de─čil. Asl─▒nda iki ayr─▒ operat├Âr, -- ve > .

Ko┼čullu kod x , x orijinal (azalt─▒lmam─▒┼č) de─čerini d├Ând├╝r├╝rken azal─▒r ve ard─▒ndan orijinal de─čeri i┼čleci 0 kullanarak kar┼č─▒la┼čt─▒r─▒r > .

Daha iyi anlamak i├žin, ifade a┼ča─č─▒daki gibi yaz─▒labilir:

 while( (x--) > 0 )
 

8205







Veya tamamen farkl─▒ bir ┼čey i├žin ... x 0'a kayar

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

├çok matematiksel de─čil, ama ... her resim bin kelime boyar ...


2883







Bu ├žok karma┼č─▒k bir operat├Âr, bu y├╝zden ISO / IEC JTC1 (Ortak Teknik Komite 1) bile tan─▒m─▒n─▒ C ++ Standard─▒n─▒n iki farkl─▒ b├Âl├╝m├╝ne yerle┼čtirdi.

┼×aka bir yana, bunlar iki farkl─▒ operat├Ârd├╝r: -- ve > s─▒ras─▒yla C ++ 03 Standard─▒n─▒n ┬ž5.2.6 / 2 ve ┬ž5.9.


2323







E┼čittir

 while (x-- > 0)
 

x-- (azaltma sonras─▒) buna e┼čde─čerdir x = x-1 , kod ┼ču ┼čekilde d├Ân├╝┼čt├╝r├╝l├╝r:

 while(x > 0) {
    x = x-1;
    // logic
}
 

1235







x ters y├Ânde daha 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

;)


1094







Onun

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

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

       printf("%d ", x);
     }

     return 0;
}
 

Sadece bo┼čluk, ┼čeylerin komik g├Âr├╝nmesini sa─člar, -- azal─▒r ve > kar┼č─▒la┼čt─▒r─▒r.


533







Kullan─▒m─▒ --> tarihi bir alaka d├╝zeyine sahiptir. Azalma, (ve hala baz─▒ durumlarda), x86 mimarisindeki art─▒┼čtan daha h─▒zl─▒yd─▒. --> Bunu kullanmak , matematiksel ge├žmi┼če sahip olanlara x gidiyor 0 ve onlar─▒ ├žekici k─▒l─▒yor.


409







 while( x-- > 0 )
 

nas─▒l ayr─▒┼čt─▒r─▒ld─▒─č─▒.


352







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

345







Okudu─čum bir kitap (hangi kitab─▒n do─čru oldu─čunu hat─▒rlam─▒yorum): Derleyiciler sol sa─č kural─▒ kullanarak ifadeleri en b├╝y├╝k belirte├žte ayr─▒┼čt─▒rmaya ├žal─▒┼č─▒yorlar .

Bu durumda, ifade:

 x-->0
 

En b├╝y├╝k belirte├žleri ayr─▒┼čt─▒r─▒r:

 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 ^^


309







Bu tamamen ayn─▒

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

negatif olmayan numaralar i├žin


261







Her neyse, ┼čimdi bir "gider" operat├Âr├╝m├╝z var. "-->" bir y├Ân olarak hat─▒rlanmas─▒ kolayd─▒r ve "x s─▒f─▒ra giderken" anlaml─▒d─▒r.

Ayr─▒ca, "for (x = 10; x > 0; x --)" baz─▒ platformlardan biraz daha verimlidir .


236







Bu kod ilk ├Ânce x ve 0'─▒ sonra da x'i azalt─▒r. (Ayr─▒ca, ilk cevab─▒nda da s├Âylenir: x azaltma i┼čleminden sonra x ile 0 ile > operat├Âr├╝n kar┼č─▒la┼čt─▒r─▒lmas─▒ ). Bu kodun ├ž─▒kt─▒s─▒na bak─▒n─▒z:

 9 8 7 6 5 4 3 2 1 0
 

┼×imdi ├Ânce kar┼č─▒la┼čt─▒r─▒r, sonra da ├ž─▒kt─▒da 0'─▒ g├Ârerek azal─▒r─▒z.

├ľnce azaltma ve sonra kar┼č─▒la┼čt─▒rma yapmak istiyorsak, bu 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 ├ž─▒kt─▒:

 9 8 7 6 5 4 3 2 1
 

216







Bu kodu ├žal─▒┼čt─▒rd─▒─č─▒mda derleyicim 9876543210 yazd─▒racak.

 #include <iostream>
int main()
{
    int x = 10;

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

Beklenildi─či gibi. while( x-- > 0 ) Asl─▒nda demektir while( x > 0) . x-- Sonras─▒ azalt─▒r x .

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

ayn─▒ ┼čeyi yazman─▒n farkl─▒ bir yoludur.

Orijinalin "x, 0'a giderken" gibi g├Âr├╝nmesi ho┼č bir ┼čey.


171







-- Ve aras─▒nda eksik bir bo┼čluk var > . x sonra reddedilir, yani durumu kontrol ettikten sonra azal─▒r x>0 ? .


143







-- bir eksiltme operat├Âr├╝ > olan b├╝y├╝kt├╝r operat├Âr.

─░ki operat├Âr, benzer bir ┼čekilde uygulan─▒r --> .


134







─░ki operat├Âr├╝n birle┼čimi. Birincisi -- , de─čeri azaltmak ve de─čerin > sa─č i┼členenden daha b├╝y├╝k olup olmad─▒─č─▒n─▒ kontrol etmek i├žindir.

 #include<stdio.h>

int main()
{
    int x = 10;

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

    return 0;
}
 

Çıktı:

 9 8 7 6 5 4 3 2 1 0            
 

126







Asl─▒nda, x azaltma sonras─▒ ve bu ko┼čulla kontrol ediliyor. O de─čil --> bu, (x--) > 0

Not: de─čeri x kontrol edildikten sonra de─či┼čti─či i├žin de─či┼čtirilir, ├ž├╝nk├╝ de─čeri azal─▒r. Baz─▒ benzer durumlar da ortaya ├ž─▒kabilir, ├Ârne─čin:

 -->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0
 

119







C ve C ++ "maksimum mide" kural─▒na uyar. Ayn─▒ ┼čekilde bir --- b'ye ├ževrilir (a--) - b , sizin durumunuzda x-->0 ├ževirir (x--)>0 .

Kural─▒n esasen s├Âyledi─či, soldan sa─ča gitmek, ifadelerin ge├žerli bir ifade olu┼čturacak en fazla karakterleri alarak olu┼čmas─▒d─▒r.


116







Neden t├╝m komplikasyonlar?

Orijinal sorunun basit cevab─▒ ┼čudur:

 #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├Âylemiyorum, ama ayn─▒ ┼čeyi yap─▒yor ve soruyu tek bir mesajda cevaplayacakt─▒.

Yukar─▒dakiler x-- i├žin sadece stenodir ve > normalden b├╝y├╝kt├╝r operator . B├╝y├╝k gizem yok!

Bug├╝nlerde basit ┼čeyleri karma┼č─▒k hale getiren ├žok fazla insan var;)


27







Geleneksel yoldan, while halka parantezindeki bir ko┼čulu ve parantezlerin i├žindeki () sonland─▒r─▒c─▒ bir ko┼čulu tan─▒mlar─▒z {} , ancak --> her ikisini de bir kerede tan─▒mlar.

├ľrne─čin:

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

Bu eksilme a ve while d├Âng├╝s├╝ ├žal─▒┼č─▒r a b├╝y├╝kt├╝r 0 .

Geleneksel olarak, ┼č├Âyle olurdu:

 int abc(void)
{
    int a = 5;
    while(a > 0)
    {
        a--;
        // Code
    }
    a--;
}
 

Her iki ┼čekilde de ayn─▒ ┼čeyi yap─▒yoruz ve ayn─▒ hedeflere ula┼č─▒yoruz.


25







(x --> 0) anlam─▒na geliyor (x-- > 0)

  1. kullanabilirsiniz (x -->)
    output -: 9 8 7 6 5 4 3 2 1 0

  2. kullanabilirsiniz (-- x > 0) demek (--x > 0)
    output -: 9 8 7 6 5 4 3 2 1

  3. kullanabilirsiniz
 (--\
    \
     x > 0)
 

output -: 9 8 7 6 5 4 3 2 1

  1. kullanabilirsiniz
 (\
  \
   x --> 0)
 

output -: 9 8 7 6 5 4 3 2 1 0

  1. kullanabilirsiniz
 (\
  \
   x --> 0
          \
           \
            )
 

output -: 9 8 7 6 5 4 3 2 1 0

  1. ayr─▒ca kullanabilirsiniz
 (
 x 
  --> 
      0
       )
 

output -: 9 8 7 6 5 4 3 2 1 0

Ayn─▒ ┼čekilde, bu komutu ba┼čar─▒yla y├╝r├╝tmek i├žin bir├žok y├Ântem deneyebilirsiniz.


2