Panah (->) prioritas / prioritas operator terendah, atau prioritas penugasan / tugas gabungan terendah?

18

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.

Kode Lengkap
sumber
5
The lowest precedence operator is the arrow of a lambda expression.
Kayaman
2
Ya, pengertian Anda benar.
Eran
4
Jika ->adalah rendah est , operator penugasan tidak dapat memiliki rendah er didahulukan.
Andy Turner
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.
Kode Lengkap
1
@glglgl contoh Anda IntUnaryOperator op; op = x -> x;menarik. Mungkin (op = x) -> xtidak dipertimbangkan karena op = xbukankah contoh LambdaParametersproduksi yang valid ?
Andy Turner

Jawaban:

13

Perhatikan kalimat sebelum teks JLS yang dikutip :

Diutamakan di antara operator dikelola oleh hirarki produksi tata bahasa.

Tata bahasa bahasa Jawa menentukan konstruksi mana yang mungkin dan secara implisit, yang diutamakan operator.

Bahkan tabel princeton yang telah Anda tautkan menyatakan:

Tidak ada tabel prioritas operator di dalam Spesifikasi Bahasa Jawa. Tabel berbeda di web dan di buku teks tidak setuju dalam beberapa hal kecil.

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:

static Consumer<String> C;
static String S;
public static void main(String[] args)
{
  Runnable r;
  r = () -> C = s -> S = s;
}
Holger
sumber
10

Pertama, mari kita jelaskan masalah praktisnya di sini.

Dengan asumsi Anda memiliki definisi suka

IntUnaryOperator op;

Berikut ini diterima secara sintaksis, dan berfungsi seperti yang diharapkan:

op = x -> x;

Artinya, kami memiliki fungsi identitas yang intditugaskan ke opvariabel. Tetapi jika =memiliki prioritas yang lebih tinggi, kami akan mengharapkan Jawa untuk menafsirkan ini sebagai

(op = x) -> x;

Yang 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 tadalah tipe / variabel kelas tipe int):

op = x -> t = x;

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 sebagai

op = ( x -> t ) = x

dan 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 :

Expression:
  LambdaExpression
  AssignmentExpression

LambdaExpression:
  LambdaParameters -> LambdaBody

...

LambdaBody:
  Expression
  Block

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:

AssignmentExpression:
  ConditionalExpression
  Assignment

Assignment:
  LeftHandSide AssignmentOperator Expression

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.

RealSkeptik
sumber