Pertanyaan Apakah operator "->" dalam C ++?


Setelah membaca Fitur Tersembunyi dan Sudut Gelap C ++ / STL di comp.lang.c++.moderated, Saya benar-benar terkejut bahwa cuplikan berikut dikompilasi dan bekerja di kedua Visual Studio 2008 dan G ++ 4.4.

Begini kodenya:

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

Saya berasumsi ini adalah C, karena ia bekerja di GCC juga. Di mana ini didefinisikan dalam standar, dan dari mana asalnya?


7773


asal


Jawaban:


--> bukan operator. Ini sebenarnya dua operator terpisah, -- dan >.

Pengurangan kode kondisional x, saat kembali xNilai asli (tidak dikurangi), lalu membandingkan nilai asli dengan 0 menggunakan > operator.

Untuk lebih memahami, pernyataan itu dapat ditulis sebagai berikut:

while( (x--) > 0 )

7470



Atau untuk sesuatu yang sama sekali berbeda ... x slide ke 0

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

Tidak begitu matematis, tapi ... setiap gambar melukis seribu kata. ...


2373



Itu operator yang sangat rumit, bahkan ISO / IEC JTC1 (Komite Teknis Gabungan 1) menempatkan deskripsinya di dua bagian berbeda dari C ++ Standard.

Bercanda samping, mereka adalah dua operator yang berbeda: -- dan > dijelaskan masing-masing dalam §5.2.6 / 2 dan §5.9 dari C ++ 03 Standard.


2221



Ini setara dengan

while (x-- > 0)

1142



x dapat mencapai nol lebih cepat dalam arah yang berlawanan:

int x = 10;

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

8 6 4 2

Anda dapat mengontrol kecepatan dengan panah!

int x = 100;

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

90 80 70 60 50 40 30 20 10

;)


859



Nya

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

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

       printf("%d ", x);
     }

     return 0;
}

Hanya ruang yang membuat semuanya terlihat lucu, -- penurunan dan > membandingkan.


498



Penggunaan dari --> memiliki relevansi historis. Decrementing (dan masih dalam beberapa kasus), lebih cepat daripada incrementing pada arsitektur x86. Menggunakan --> menunjukkan itu x akan 0, dan menarik bagi mereka dengan latar belakang matematika.


371



while( x-- > 0 )

adalah bagaimana itu diuraikan.


324



Benar-benar aneh, tapi saya akan menggunakan ini:

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

291