Setelah membaca Fitur Tersembunyi dan Sudut Gelap C ++ / STL aktif comp.lang.c++.moderated
, saya benar-benar terkejut bahwa cuplikan berikut dikompilasi dan bekerja di Visual Studio 2008 dan G ++ 4.4.
Berikut kodenya:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Keluaran:
9 8 7 6 5 4 3 2 1 0
Saya berasumsi ini C, karena berfungsi di GCC juga. Di mana ini didefinisikan dalam standar, dan dari mana asalnya?
c++
c
operators
code-formatting
standards-compliance
GManNickG
sumber
sumber
++
atau--
sebelum ...#define upto ++<
,#define downto -->
. Jika Anda merasa jahat, Anda dapat melakukan#define for while(
dan#define do ) {
(dan#define done ;}
) dan menulisfor x downto 0 do printf("%d\n", x) done
Oh, kemanusiaan ...Jawaban:
-->
bukan operator. Sebenarnya dua operator terpisah,--
dan>
.Pengurangan kode kondisional
x
, sambil mengembalikan nilaix
asli (tidak dikurangi), dan kemudian membandingkan nilai asli dengan0
menggunakan>
operator.Untuk lebih memahami, pernyataan itu dapat ditulis sebagai berikut:
sumber
while (x-- > 0)
akan lebih tepat. Itu juga membuatnya lebih jelas apa yang terjadi (setidaknya dalam editor font tetap) yang berarti bahwa tanda kurung dalam jawaban ini tidak perlu.Atau untuk sesuatu yang sama sekali berbeda ...
x
slide0
.Tidak begitu matematis, tapi ... setiap gambar melukis seribu kata ...
sumber
why waste words when a picture does a better job
, digunakan sebagai lelucon dalam konteks ini. (sebenarnya ada 2 kata kunciwhile
danprintf
)Itu operator yang sangat rumit, bahkan ISO / IEC JTC1 (Joint Technical Committee 1) menempatkan deskripsinya dalam dua bagian berbeda dari Standar C ++.
Di samping bercanda, mereka adalah dua operator yang berbeda:
--
dan>
dijelaskan masing-masing dalam §5.2.6 / 2 dan §5.9 dari Standar C ++ 03.sumber
Ini setara dengan
x--
(post decrement) setara denganx = x-1
itu, kode berubah menjadi:sumber
0 >-- x
Dalam halx
ini dikurangi sebelum logika. Dalam postfix, logika dieksekusi sebelum penurunan dan dengan demikian kedua sampel setara. Jangan ragu untuk menuliskannya dalamConsole
dan mengujinya.while(x=x-1,x+1 > 0)
setara.x
dapat mencapai nol lebih cepat di arah yang berlawanan:8 6 4 2
Anda dapat mengontrol kecepatan dengan panah!
90 80 70 60 50 40 30 20 10
;)
sumber
Nya
Hanya ruang membuat hal-hal terlihat lucu,
--
mengurangi dan>
membandingkan.sumber
Penggunaan
-->
memiliki relevansi historis. Pengurangan adalah (dan masih dalam beberapa kasus), lebih cepat daripada peningkatan pada arsitektur x86. Menggunakan-->
menyarankan yangx
akan0
, dan menarik bagi mereka yang memiliki latar belakang matematika.sumber
adalah bagaimana itu diuraikan.
sumber
Benar-benar geek, tapi saya akan menggunakan ini:
sumber
do ... while
adalah daftar pernyataan. Dalam C itu adalah sebuah blok, jadi harus demikiando { ... } while
.do statement while ( expression ) ;
. Karena itu, saya harap ini dipahami saya maksud contoh sebagai lelucon.Satu buku yang saya baca (saya tidak ingat buku mana) menyatakan: Kompiler mencoba mengurai ekspresi ke token terbesar dengan menggunakan aturan kiri kanan.
Dalam hal ini, ungkapan:
Parsing ke token terbesar:
Aturan yang sama berlaku untuk ungkapan ini:
Setelah diurai:
Saya harap ini membantu untuk memahami ungkapan yang rumit ^^
sumber
a-----b
dan berpikir(a--)-- - b
, yang tidak dikompilasi karenaa--
tidak mengembalikan nilai.x
dan--
merupakan dua token yang terpisah.-->
sebagai operator (yang tersirat dengan pertanyaan yang diajukan), jawaban ini tidak membantu sama sekali - Anda akan berpikir bahwa token 2 adalah-->
, bukan hanya--
. Jika Anda tahu itu-->
bukan operator, Anda mungkin tidak memiliki masalah dalam memahami kode dalam pertanyaan, jadi, kecuali Anda memiliki pertanyaan yang sama sekali berbeda, saya tidak begitu yakin bagaimana ini bisa berguna.a
operator post-decrement kelebihan beban, yang mengembalikan nilai. coliru.stacked-crooked.com/a/e1effc351ae79e9fIni persis sama dengan
untuk nomor non-negatif
sumber
for(--x++;--x;++x--)
?unsigned
bagi--x++
memiliki perilaku yang tidak terdefinisi menurut §1.9.15unsigned
, itu akan digunakan%u
Bagaimanapun, kami memiliki operator "pergi ke" sekarang.
"-->"
mudah diingat sebagai arah, dan "sementara x pergi ke nol" artinya langsung.Selain itu, ini sedikit lebih efisien daripada
"for (x = 10; x > 0; x --)"
pada beberapa platform.sumber
for (size_t x=10; x-->0; )
tubuh loop dijalankan dengan 9,8, .., 0 sedangkan versi lainnya memiliki 10,9, .., 1. Sebaliknya, cukup sulit untuk keluar dari loop ke nol dengan variabel yang tidak ditandatangani.++>
untuk melakukan pekerjaan tambahan.int
, jadi bisa dengan mudah memakan anjing Andax
sampai nol jika mulai negatif.0
. (Sebagai perbandingan, ungkapan menghilangkan tes untuk nol, seperti menuliswhile (n--)
bukan untuk yang tidak ditandatanganin
, tidak memberi Anda apa pun dan bagi saya sangat menghambat keterbacaan.) Ia juga memiliki properti menyenangkan yang Anda tentukan satu lebih dari indeks awal, yang biasanya Anda inginkan (misalnya, untuk loop di atas array Anda tentukan ukurannya). Saya juga suka-->
tanpa ruang, karena ini membuat idiom mudah dikenali.Kode ini pertama kali membandingkan x dan 0 dan kemudian mengurangi x. (Juga disebutkan dalam jawaban pertama: Anda adalah post-decrementing x dan kemudian membandingkan x dan 0 dengan
>
operator.) Lihat output dari kode ini:Kami sekarang pertama-tama membandingkan dan kemudian mengurangi dengan melihat 0 di output.
Jika kita ingin mengurangi pertama dan kemudian membandingkan, gunakan kode ini:
Output itu adalah:
sumber
Kompiler saya akan mencetak 9876543210 ketika saya menjalankan kode ini.
Seperti yang diharapkan. The
while( x-- > 0 )
sebenarnya berartiwhile( x > 0)
. Thex--
pasca decrementsx
.adalah cara berbeda untuk menulis hal yang sama.
Sangat menyenangkan bahwa aslinya terlihat seperti "sementara x pergi ke 0" sekalipun.
sumber
while( x-- > 0 ) actually means while( x > 0)
- Saya tidak yakin apa yang ingin Anda katakan di sana, tetapi cara Anda mengatakannya menyiratkan--
tidak memiliki arti apa pun, yang jelas sangat salah.x
akan-1
setelah itu meninggalkan loop, sedangkan di jawaban ini,x
akan0
.Ada ruang yang hilang antara
--
dan>
.x
adalah post decremented, yaitu decremented setelah memeriksa kondisix>0 ?
.sumber
#define foo()
versus#define foo ()
.--
adalah penurunan operator dan>
adalah lebih besar daripada operator.Kedua operator diterapkan seperti satu
-->
.sumber
Ini kombinasi dari dua operator. Pertama
--
adalah untuk mengurangi nilai, dan>
untuk memeriksa apakah nilainya lebih besar dari operan kanan.Outputnya adalah:
sumber
Sebenarnya,
x
post-decrementing dan dengan kondisi itu sedang diperiksa. Ini tidak-->
, itu(x--) > 0
Catatan: nilai
x
diubah setelah kondisi diperiksa, karena post-decrementing. Beberapa kasus serupa juga dapat terjadi, misalnya:sumber
x
dimulai pada 1, tetapiwhile ( (x--) > 0 )
akan. {sunting} Eric Lippert membahas keduanya dalam catatan rilis C # 4nyaC dan C ++ mematuhi aturan "maksimum mengunyah". Cara yang sama a --- b diterjemahkan ke
(a--) - b
, dalam kasus Andax-->0
diterjemahkan menjadi(x--)>0
.Pada dasarnya aturan mengatakan bahwa dari kiri ke kanan, ekspresi dibentuk dengan mengambil karakter maksimum yang akan membentuk ekspresi yang valid.
sumber
Kenapa semua komplikasinya?
Jawaban sederhana untuk pertanyaan awal adalah:
Melakukan hal yang sama. Tidak mengatakan Anda harus melakukannya seperti ini, tetapi melakukan hal yang sama dan akan menjawab pertanyaan dalam satu posting.
Ini
x--
hanya singkatan untuk di atas, dan>
hanya lebih besar dari normaloperator
. Bukan misteri besar!Ada terlalu banyak orang membuat hal-hal sederhana menjadi rumit saat ini;)
sumber
The OP's way: 9 8 7 6 5 4 3 2 1 0
danThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
x=x-1
sebelumprintf
Anda maka Anda dapat mengatakan "itu melakukan hal yang sama".Dengan cara konvensional kita akan mendefinisikan suatu kondisi dalam
while
kurung loop()
dan kondisi terminating di dalam kurung{}
, tetapi-->
mendefinisikan keduanya sekaligus.Sebagai contoh:
Ini mengurangi
a
dan menjalankan loop sementaraa
lebih besar dari0
.Secara konvensional, itu akan seperti:
Kedua cara, kami melakukan hal yang sama dan mencapai tujuan yang sama.
sumber
test-write-execute
seperti dalam pertanyaan, terima kasih telah menunjukkan!(x --> 0)
cara(x-- > 0)
(x -->)
output -: 9 8 7 6 5 4 3 2 1 0
(-- x > 0)
itu berarti(--x > 0)
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
Anda juga dapat mencoba banyak metode untuk menjalankan perintah ini dengan sukses
sumber