ลูกศร (->) ลำดับความสำคัญของผู้ประกอบการ / ลำดับความสำคัญต่ำสุดหรือลำดับความสำคัญของการมอบหมาย / การมอบหมายรวมมีค่าต่ำสุด?


18

JLS :

ประกอบการต่ำสุดสำคัญคือลูกศรของนิพจน์แลมบ์ดา (->) , ตามโดยผู้ประกอบการที่ได้รับมอบหมาย

ตามไปในทิศทางใด (เพิ่มความสำคัญลดลำดับความสำคัญ) - "ติดตาม" หมายถึงการมอบหมายมีลำดับความสำคัญสูงกว่าหรือมีลำดับความสำคัญต่ำกว่า (เกี่ยวข้องกับตัวดำเนินการลูกศร) ฉันเดาว่าเพิ่มมากขึ้นเพราะ "ต่ำสุด" (สำหรับลูกศร) หมายถึงต่ำที่สุดอย่างแน่นอน

ดังที่ฉันเข้าใจแล้วลูกศร (->) ควรอยู่ที่ด้านล่างสุดของตารางตัวดำเนินการของพรินซ์ตัน (ซึ่งอยู่ต่ำกว่าตัวดำเนินการที่ได้รับมอบหมายทั้งหมด) ดังนั้นลูกศร (->) มีระดับความสำคัญ 0 (ศูนย์) (ตามตารางนั้น)

ฉันถูกต้องในการทำความเข้าใจของฉัน?

ExamTrayดูเหมือนจะบอกว่าลูกศรลำดับความสำคัญเป็นอย่างน้อยเช่นเดียวกับการมอบหมาย ... และชี้แจงว่าลูกศรสัมพันธ์เป็นซ้าย -> ถึง -> ขวา (ซึ่งแตกต่างจากการกำหนด) ฉันไม่พบใบเสนอราคาของ JLS สำหรับการเชื่อมโยงลูกศร

ฉันมักจะคิดว่าลำดับความสำคัญของการมอบหมายนั้นต่ำที่สุดโดยมีเหตุผล


5
The lowest precedence operator is the arrow of a lambda expression.
Kayaman

2
ใช่ความเข้าใจของคุณถูกต้อง
Eran

4
ถ้า->เป็นระดับต่ำคือผู้ประกอบการที่ได้รับมอบหมายไม่สามารถมีต่ำเอ้อความสำคัญ
Andy Turner

IntFunction fo = a->b->a-b; // in test หมายถึงลำดับความสำคัญ / การเชื่อมโยงของ -> โดยทั่วไป ดังนั้นฉันจึงตัดสินใจที่จะชี้แจง -> สถานที่ที่มีความสำคัญ / ความสัมพันธ์ในตารางที่มาก่อน / ความสัมพันธ์ทั้งหมดเพราะรู้สึกไม่แน่ใจ
รหัสเสร็จสมบูรณ์

1
@glglgl ตัวอย่างของคุณIntUnaryOperator op; op = x -> x;น่าสนใจ อาจ(op = x) -> xไม่ได้รับการพิจารณาเนื่องจากop = xไม่มีอินสแตนซ์ที่ถูกต้องของการLambdaParametersผลิตใช่หรือไม่
Andy Turner

คำตอบ:


13

สังเกตประโยคก่อนหน้าข้อความ JLS ที่ยกมา:

ลำดับความสำคัญระหว่างตัวดำเนินการได้รับการจัดการโดยลำดับชั้นของการผลิตไวยากรณ์

ไวยากรณ์ของภาษาจาวากำหนดว่าโครงสร้างใดที่เป็นไปได้และโดยนัยคือตัวดำเนินการที่สำคัญ

แม้แต่ตารางพรินซ์ตันที่คุณเชื่อมโยงรัฐ:

ไม่มีตารางตัวดำเนินการที่ชัดเจนก่อนหน้านี้ใน Java Language Specification ตารางที่แตกต่างกันบนเว็บและในตำราเรียนไม่เห็นด้วยในบางวิธี

ดังนั้นไวยากรณ์ของภาษา Java ->ไม่อนุญาตให้มีการแสดงออกแลมบ์ดาไปทางซ้ายของผู้ประกอบการที่ได้รับมอบหมายและเช่นเดียวกันไม่อนุญาตให้ได้รับมอบหมายไปทางซ้ายของ ดังนั้นจึงไม่มีความคลุมเครือระหว่างโอเปอเรเตอร์เหล่านี้ที่เป็นไปได้และกฎที่มีความสำคัญแม้ว่าที่ระบุไว้อย่างชัดเจนใน JLS จะไม่มีความหมาย

สิ่งนี้ทำให้สามารถรวบรวมได้เช่นอัญมณีโดยปราศจากความกำกวม:

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

10

ก่อนอื่นเรามาอธิบายเรื่องการปฏิบัติที่นี่

สมมติว่าคุณมีความหมายเช่น

IntUnaryOperator op;

ต่อไปนี้ได้รับการยอมรับทางไวยากรณ์และทำงานตามที่คาดไว้:

op = x -> x;

นั่นคือเรามีฟังก์ชั่นระบุตัวตนที่intกำหนดให้กับopตัวแปร แต่ถ้า=มีลำดับความสำคัญสูงกว่าเราคาดหวังว่า Java จะตีความสิ่งนี้ว่า

(op = x) -> x;

ซึ่งไม่ถูกต้องทางไวยากรณ์ดังนั้นจึงควรรวบรวมข้อผิดพลาด ดังนั้นในทางปฏิบัติการมอบหมายไม่ได้มีความสำคัญสูงกว่าลูกศร

แต่สิ่งต่อไปนี้ก็ใช้ได้เช่นกัน (สมมติว่าtเป็นตัวแปรประเภท / คลาสของประเภทint):

op = x -> t = x;

การคอมไพล์นี้และฟังก์ชั่นหากนำไปใช้จะกำหนดค่าของตัวถูกดำเนินการให้tและยังส่งกลับ

t = xซึ่งหมายความว่าลูกศรไม่ได้มีความสำคัญสูงกว่าที่ได้รับมอบหมาย มิฉะนั้นจะถูกตีความว่าเป็น

op = ( x -> t ) = x

และชัดเจนว่านี่ไม่ใช่สิ่งที่เกิดขึ้น

ดังนั้นดูเหมือนว่าการดำเนินการมีความสำคัญเท่ากัน ยิ่งไปกว่านั้นพวกเขามีความสัมพันธ์ที่ถูกต้อง สิ่งนี้บอกเป็นนัยจากไวยากรณ์ที่JLS บทที่ 19 :

Expression:
  LambdaExpression
  AssignmentExpression

LambdaExpression:
  LambdaParameters -> LambdaBody

...

LambdaBody:
  Expression
  Block

ดังนั้นทางด้านขวาของร่างกายแลมบ์ดาทำให้เรากลับมาExpressionซึ่งหมายความว่าเราสามารถมีแลมบ์ดา (มีลำดับความสำคัญสูงกว่า) ภายในหรือการมอบหมาย (ลำดับความสำคัญสูงกว่า) ในนั้น สิ่งที่ฉันหมายถึงโดย "ลำดับความสำคัญสูงกว่า" ก็คือยิ่งคุณผ่านกฎการผลิตที่ลึกซึ้งยิ่งขึ้นเท่าไหร่นิพจน์ก่อนหน้านี้จะถูกประเมิน

สิ่งนี้เป็นจริงสำหรับผู้ดำเนินการที่ได้รับมอบหมาย:

AssignmentExpression:
  ConditionalExpression
  Assignment

Assignment:
  LeftHandSide AssignmentOperator Expression

อีกครั้งทางด้านขวาของการมอบหมายโยนเรากลับไปที่Expressionดังนั้นเราจึงสามารถแสดงออกแลมบ์ดาหรือการมอบหมายที่นั่น

ดังนั้นแทนที่จะอาศัยข้อความ JLS ไวยากรณ์ให้คำอธิบายที่ชัดเจนเกี่ยวกับสถานการณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.