JLS :
The Operator didahulukan terendah adalah panah dari ekspresi lambda (->) , diikuti oleh operator penugasan.
Diikuti ke arah mana (meningkatkan prioritas, mengurangi prioritas)? - "mengikuti" berarti penugasan memiliki prioritas lebih tinggi atau prioritas lebih rendah (berkenaan dengan operator panah)? Saya kira, dalam peningkatan, karena "terendah" (untuk panah) berarti sangat rendah.
Seperti yang saya mengerti, panah (->) harus berada di paling bawah tabel prioritas operator Princeton ini (yang di bawah semua operator penugasan), sehingga panah (->) memiliki 0 (nol) Tingkat prioritas (sesuai tabel itu).
Apakah saya benar dalam pengertian saya?
ExamTray tampaknya mengatakan bahwa prioritas panah setidaknya sama dengan penugasan ... Plus menjelaskan bahwa associativity panah adalah Left-> To-> Right (tidak seperti penugasan). Saya tidak menemukan kutipan JLS untuk asosiasi panah.
Saya selalu berpikir bahwa prioritas penugasan pada prinsipnya terendah karena suatu alasan.
sumber
The lowest precedence operator is the arrow of a lambda expression.
->
adalah rendah est , operator penugasan tidak dapat memiliki rendah er didahulukan.IntFunction fo = a->b->a-b; // in test
Mengimplikasikan prioritas / asosiasi - - secara umum. Jadi saya memutuskan untuk mengklarifikasi -> tempat presedensi / asosiatif di seluruh tabel presedensi / asosiatif karena merasa tidak yakin tentang hal itu.IntUnaryOperator op; op = x -> x;
menarik. Mungkin(op = x) -> x
tidak dipertimbangkan karenaop = x
bukankah contohLambdaParameters
produksi yang valid ?Jawaban:
Perhatikan kalimat sebelum teks JLS yang dikutip :
Tata bahasa bahasa Jawa menentukan konstruksi mana yang mungkin dan secara implisit, yang diutamakan operator.
Bahkan tabel princeton yang telah Anda tautkan menyatakan:
Jadi, tata bahasa Jawa tidak memungkinkan ekspresi lambda di sebelah kiri operator penugasan dan juga, tidak memungkinkan penugasan di sebelah kiri
->
. Jadi tidak ada ambiguitas antara operator ini mungkin dan aturan diutamakan, meskipun secara eksplisit dinyatakan dalam JLS, menjadi tidak berarti.Ini memungkinkan untuk mengkompilasi, misalnya permata seperti itu, tanpa ambiguitas:
sumber
Pertama, mari kita jelaskan masalah praktisnya di sini.
Dengan asumsi Anda memiliki definisi suka
Berikut ini diterima secara sintaksis, dan berfungsi seperti yang diharapkan:
Artinya, kami memiliki fungsi identitas yang
int
ditugaskan keop
variabel. Tetapi jika=
memiliki prioritas yang lebih tinggi, kami akan mengharapkan Jawa untuk menafsirkan ini sebagaiYang tidak valid secara sintaksis, dengan demikian harus menjadi kesalahan kompilasi. Oleh karena itu, penugasan tidak dalam praktiknya memiliki prioritas lebih tinggi daripada panah.
Tetapi yang berikut ini juga OK (asumsikan
t
adalah tipe / variabel kelas tipeint
):Ini mengkompilasi, dan fungsi, jika diterapkan, memberikan nilai operan ke
t
dan juga mengembalikannya.Ini berarti bahwa panah tidak memiliki prioritas lebih tinggi dari penugasan
t = x
. Kalau tidak, itu akan ditafsirkan sebagaidan jelas, ini bukan yang terjadi.
Jadi sepertinya operasi memiliki prioritas yang sama. Terlebih lagi, mereka asosiatif benar. Ini tersirat dari tata bahasa di JLS bab 19 :
Jadi sisi kanan tubuh lambda membuat kita kembali
Expression
, yang berarti kita dapat memiliki (prioritas lebih tinggi) lambda di dalamnya, atau tugas (prioritas lebih tinggi) di dalamnya. Yang saya maksud dengan "prioritas yang lebih tinggi" adalah bahwa semakin dalam Anda mempelajari aturan-aturan produksi, semakin dini ungkapan itu akan dievaluasi.Hal yang sama berlaku untuk operator penugasan:
Sekali lagi, sisi kanan penugasan membuat kami kembali
Expression
, sehingga kita dapat memiliki ekspresi lambda atau tugas di sana.Jadi daripada mengandalkan teks JLS, tata bahasa memberi kita deskripsi situasi yang jelas.
sumber